2013-11-26 4 views
5

Я стараюсь изо всех сил использовать некоторую базовую реализацию MagicalRecord, чтобы получить зависание и перейти к следующему.MagicalRecord не сохраняет данные

Когда я сохраняю запись и затем извлекаю записи такого типа, она будет содержать запись, которую я только что сохранил. Однако, когда я сохраняю запись, закройте приложение, запустите его снова, а затем извлеките, оно становится пустым.

Код для сохранения:

- (void)createTestTask{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread]; 

    Task *task = [Task createInContext:localContext]; 
    task.tName = @"First Task"; 
    task.tDescription = @"First Task created with MagicalRecord. Huzzah!"; 


    NSError *error; 
    [localContext save:&error]; 
    if (error != Nil) { 
     NSLog(@"%@", error.description); 
    } 
} 

Код для выборки: (все, что я хочу знать здесь, если что-нибудь на самом деле сохранен)

- (void) fetchTasks{ 
    NSArray *tasks = [Task findAll]; 
    NSLog(@"Found %d tasks", [tasks count]); 
} 

Я уверен, что я пропускаю что-то здесь, но не все, что я могу найти в stackoverflow или в учебниках, на которые я смотрел.

Любая помощь приветствуется.

ответ

8

Я должен спросить очевидное «ли он подключен» вопрос: Вы инициализации основных данных стека с одним из +[MagicalRecord setupCoreDataStack] методов?

Правильно ли ваш стек инициализирован? То есть, ваш магазин и модель совместимы? Когда это не так, MagicalRecord (более подходящим образом, Core Data) настроит весь стек без Persistent Store. Это раздражает, потому что похоже, что все в порядке, пока оно не может быть сохранено в магазине ... потому что магазина нет. MagicalRecord имеет метод +[MagicalRecord currentStack], который можно использовать для проверки текущего состояния стека. Попробуйте это в отладчике после того, как вы настроили свой стек.

Предполагая, что вы сделали это, другое, что нужно проверить, это журнал ошибок. Если вы используете

[localContext MR_saveToPersistentStoreAndWait]; 

Любые ошибки должны быть зарегистрированы на консоли. Обычно, когда вы не видите данные при последующем запуске своего приложения, это происходит потому, что данные не были сохранены, когда вы считали, что вы вызвали сохранение. И сохранение, в свою очередь, не происходит, потому что ваши данные не подтвердили правильность. Обычный пример - если у вас есть требуемое свойство, и он все равно равен нулю в момент вызова save. «Нормальные» данные ядра не регистрируют эти проблемы вообще, поэтому вы можете подумать, что это сработало, когда на самом деле операция сохранения завершилась неудачно. С другой стороны, MagicalRecord будет захватывать все эти ошибки и записывать их на консоль, по крайней мере, сообщая вам, что происходит с вашими данными.

+1

saveToPersistentStoreAndWait сделал трюк. CurrentStack показал, что он работает как минимум. Не знаете, почему сохранение не выполнялось должным образом, но saveToPersistentStoreAndWait. Есть идеи по этому поводу? – ophychius

3

Когда я начал с магической записи, мне также пришлось столкнуться с этой проблемой, проблема заключается в контексте, который вы используете для сохранения данных. Вот мой код, который может помочь вам

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

       NSArray *userInfoArray = [UserBasicInfo findByAttribute:@"userId" withValue:[NSNumber numberWithInt:loggedInUserId] inContext:localContext]; 

       UserBasicInfo* userInfo; 

       if ([userInfoArray count]) { 
        userInfo = [userInfoArray objectAtIndex:0]; 
       } else { 
        userInfo = [UserBasicInfo createInContext:localContext]; 
       } 

       userInfo.activeUser = [NSNumber numberWithBool:YES]; 
       userInfo.firstName = self.graphUser[@"first_name"]; 
       userInfo.lastName = self.graphUser[@"last_name"]; 
       userInfo.userId = @([jsonObject[@"UserId"] intValue]); 
       userInfo.networkUserId = @([jsonObject[@"NetworkUserId"] longLongValue]); 
       userInfo.userPoint = @([jsonObject[@"PointsEarned"] floatValue]); 
       userInfo.imageUrl = jsonObject[@"Picturelist"][0][@"PictureUrL"]; 
       userInfo.imageUrlArray = [NSKeyedArchiver archivedDataWithRootObject:jsonObject[@"Picturelist"]]; 
      } completion:^(BOOL success, NSError *error) { 

      }]; 
0

Используйте этот режим, когда сделано

[[NSManagedObjectContext MR_defaultContext]saveToPersistentStoreAndWait]; 
+0

Этот вопрос уже был дан ... и то, что вы упомянули, было частью первоначального ответа .... – ophychius

Смежные вопросы