2015-03-14 3 views
0

У меня есть экран, который содержит UITableView, на этом экране у меня есть массив NSManagedObjects. Он работает отлично, но когда я пытаюсь перейти на другой экран (нажмите на конкретную ячейку и нажмите новый экран), затем вернитесь к тому же экрану UITableView, все объекты потерялись.Объекты CoreData не сохраняются между экранами

Что это значит? Я пытаюсь напечатать массив NSManagedObjects, и все в порядке, все объекты есть, но когда я печатаю описание каждого объекта, я получаю nil из всех атрибутов объекта.

Кто-то знает, в чем причина? Я не знаю, почему, но все прошло отлично, 12 часов назад, но теперь все испортилось, и я не знаю, что я сделал.

Заранее благодарен!

Сохранить метод:

- (void)saveContext { 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) { 
     NSError *error = nil; 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
     else { 
      NSLog(@"Context saved!"); 
     } 
    } 
} 

Это, как я сохранить объекты:

NSDictionary *response = responseObject; 
if ([[response valueForKey:@"status"] rangeOfString:@"ok"].location != NSNotFound) 
{ 
    NSArray *data = [response objectForKey:@"data"]; 
    if (data.count != 0) 
    { 
     if (page.integerValue == 0) { 
      [[DownloadData sharedData] deleteAllObjectsFromEntityName:@"DbHomeCuisine"]; 
      [[DownloadData sharedData] deleteAllObjectsFromEntityName:@"DbHomeCategory"]; 
      [[DownloadData sharedData] deleteAllObjectsFromEntityName:@"DbHomeDish"]; 
     } 

     NSMutableArray *homePageObjects = [[NSMutableArray alloc] initWithCapacity:data.count]; 
     for (NSDictionary *object in data) 
     { 
      NSNumber *type = [object objectForKey:@"type"]; 
      switch (type.integerValue) { 
       case 1: 
       { 
        NSDictionary *content = [object objectForKey:@"content"]; 
        NSManagedObjectContext *context = [[MainDb sharedDb] managedObjectContext]; 
        DbHomeCuisine *homeCuisine = [NSEntityDescription insertNewObjectForEntityForName:@"DbHomeCuisine" inManagedObjectContext:context]; 
        NSInteger cuisineId = [[content valueForKey:@"cuisine_id"] integerValue]; 
        homeCuisine.cuisine = [self gCuisineWithCuisineId:[NSNumber numberWithInteger:cuisineId]]; 
        NSInteger count = [[content valueForKey:@"count"] integerValue]; 
        homeCuisine.count = [NSNumber numberWithInteger:count]; 
        homeCuisine.type = type; 
        [homePageObjects addObject:homeCuisine]; 
       } 
        break; 

       case 2: 
       { 
        NSDictionary *content = [object objectForKey:@"content"]; 
        NSManagedObjectContext *context = [[MainDb sharedDb] managedObjectContext]; 
        DbHomeCategory *homeCategory = [NSEntityDescription insertNewObjectForEntityForName:@"DbHomeCategory" inManagedObjectContext:context]; 
        NSInteger categoryId = [[content valueForKey:@"category_id"] integerValue]; 
        homeCategory.category = [self gCategoryWithCategoryId:[NSNumber numberWithInteger:categoryId]]; 
        NSInteger count = [[content valueForKey:@"count"] integerValue]; 
        homeCategory.count = [NSNumber numberWithInteger:count]; 
        homeCategory.type = type; 
        [homePageObjects addObject:homeCategory]; 
       } 
        break; 

       case 3: 
       { 
        NSDictionary *content = [object objectForKey:@"content"]; 
        NSManagedObjectContext *context = [[MainDb sharedDb] managedObjectContext]; 
        DbHomeDish *homeDish = [NSEntityDescription insertNewObjectForEntityForName:@"DbHomeDish" inManagedObjectContext:context]; 
        homeDish.dishId   = [self gInt:content forKey:@"dish_id"]; 
        homeDish.headline  = [AppUtils checkForEmptyValue:[content valueForKey:@"title"]]; 
        homeDish.text   = [AppUtils checkForEmptyValue:[content valueForKey:@"description"]]; 
        homeDish.cuisineId  = [self gInt:content forKey:@"cuisine_id"]; 
        homeDish.cuisine   = [self gCuisineWithCuisineId:homeDish.cuisineId]; 
        homeDish.creationDate = [AppUtils checkForEmptyValue:[content valueForKey:@"creation_time"]]; 
        homeDish.userId   = [self gInt:content forKey:@"user_id"]; 
        homeDish.longitude  = [self gDouble:content forKey:@"lng"]; 
        homeDish.latitude  = [self gDouble:content forKey:@"lat"]; 
        homeDish.lastPromoteDate = [AppUtils checkForEmptyValue:[content valueForKey:@"last_promote_time"]]; 
        homeDish.price   = [self gInt:content forKey:@"price"]; 
        homeDish.currency  = [AppUtils checkForEmptyValue:[content valueForKey:@"currency"]]; 
        homeDish.countryName  = [AppUtils checkForEmptyValue:[content valueForKey:@"country_name"]]; 
        homeDish.baseCurrency = [self gFloat:content forKey:@"base_currency"]; 
        homeDish.exchangeRate = [self gFloat:content forKey:@"exchange_rate"]; 
        homeDish.countryIsoCode = [AppUtils checkForEmptyValue:[content valueForKey:@"country_iso_code"]]; 
        homeDish.mainPhoto  = [AppUtils checkForEmptyValue:[content valueForKey:@"main_photo"]]; 
        homeDish.like   = [self gLikeWithDishId:homeDish.dishId]; 
        homeDish.profileImageURL = [AppUtils checkForEmptyValue:[content valueForKey:@"profile_img_url"]]; 
        homeDish.likeCount  = [self gInt:content forKey:@"likes"]; 
        homeDish.type   = type; 
        [homePageObjects addObject:homeDish]; 
       } 
        break; 

       default: 
        break; 
      } 
     } 

     // @@log -- Save data to core data and device 
     // 
     // 
     [[MainDb sharedDb] saveContext]; 

     if (success) { 
      success(operation, homePageObjects); 
     } 
    } 
} 
+1

Показать код для модов данных, сохранить и переходы UI – Wain

+0

@ В моей основной модели данных есть 15 объектов ... Как их показать? Сохранение - это базовое сохранение CoreData. Переход UI - это простой Push от UINavigationController. –

+0

И как вы вернетесь? Нам не нужны все сущности, но пример того, как вы обновляете и сохраняете модель, а затем запрашивайте ее снова. Переходная часть - это больше о том, к чему вы вернулись. На данный момент у вас вопрос - это широкая «догадка, что я, возможно, сделал не так», как таковой, не подлежащий обсуждению ... – Wain

ответ

1

Серьезно, вы должны рассмотреть рефакторинга с использованием NSFetchedResultsController. Начните с шаблона, представленного в Xcode (New Project -> Master/Detail -> check Core Data, код находится в MasterViewController.m).

Я категорически отказываюсь загружать объекты Core Data в массив, который будет отображаться в виде таблицы. Ваша проблема типична для такой настройки, и вы также столкнетесь с проблемами памяти и производительности.

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