Основные данные не обновляются до тех пор, пока приложение не прекратит работу - PullRequest
1 голос
/ 15 ноября 2009

У меня проблема с Core Data ... вот моя ситуация:

У меня есть Ресторан, и у этого ресторана есть категория, которая имеет отношение ко многим, и категория также имеет отношение ко многим по отношению к ресторанам. например:
McDonald's имеет категорию: (категория) Быстрое питание, (категория) Местные

Категория (Фастфуд)
Тип: (NSString) Фастфуд)
Ресторан: (Ресторан) McDonald's, (Ресторан) Burger King ... и т.д.

Так что это работает. Я могу показать, добавить эти данные, удалить и т. Д. Проблема, с которой я сталкиваюсь: я не могу отобразить результаты, пока не остановлю и не перезапущу свои приложения. Кажется, я не могу «обновить» свой управляемый объект новыми данными.

Например: В настоящее время McDonald's имеет категорию Fast Good и Local, но в моем приложении я хочу, чтобы пользователь мог добавить еще одну категорию. Итак, пользователь заходит, видит список категорий и затем выбирает категорию «Обед». Вот код, который я использую для этого:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"EditCatagoriesTableViewController - didSelectRowAtIndexPath section:%d row:%d ",indexPath.section,indexPath.row);

    if ([tableView cellForRowAtIndexPath:indexPath].accessoryType != UITableViewCellAccessoryCheckmark){

        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;  
        [restaurant addCategoriesObject:(Category*)[categoryArray objectAtIndex:indexPath.row]];
    }else{
        if ( [currentCategories  containsObject:[categoryArray objectAtIndex:indexPath.row]] )
            [restaurant removeCategoriesObject:(Category*)[categoryArray objectAtIndex:indexPath.row]];

        }else{
            NSLog(@"Object Not Present");
        }
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;  

    }

    NSError *error = nil;
    if (![ [restaurant managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }       
    if (![ [[categoryArray objectAtIndex:indexPath.row] managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Это работает только в том случае, если я выключил свое приложение и перезагрузил его. Но если я использую свой ресторанный объект (который является управляемым объектом для McDonald's), он не появится, пока это приложение не закроется, Я открыл точку останова и в GDB сделал это:

(gdb) po restaurant
<Restaurant: 0x114cf80> (entity: Restaurant; id: 0x114b660 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Restaurant/p2> ; data: {
    categories =     (
        0x131f560 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Category/p7>
    );
    city = "Cedar Park";
    deals =     (
    );
    foodTypes =     (
    );
    name = "Mc Donalds";
    phoneNumber = "(512)336-0323";
    state = TX;
    "street_1" = "1103 N Bell Blvd";
    "street_2" = "";
    timeStamp = nil;
    webAddress = "http://www.mcdonalds.com/";
    zip = 78613;
})

Как вы видите, категории показаны как единые (в данном случае только одна категория связана с этим рестораном)

<Category: 0x132d9c0> (entity: Category; id: 0x132cf80 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Category/p4> ; data: {
    Restaurant =     (
        0x114b660 <x-coredata://9477D580-A02E-482C-AF7B-F01D6E9AC332/Restaurant/p2>
    );
    name = "Weekday Lunch Spot";
})

Тем не менее, моя категория (место для обеда) показывает, что у нее есть указатель на ресторан Mc Donald's

Итак, как мне освежить ресторан, чтобы я мог увидеть новый объект?

Ответы [ 2 ]

1 голос
/ 15 ноября 2009

Почти всегда это результат того, что КВО не наблюдает за изменением. Вы непосредственно модифицируете объекты или используете методы KVC для установки атрибутов?

0 голосов
/ 06 апреля 2012

Я также столкнулся с той же проблемой, что основные данные не обновлялись, пока я не перезапустил приложение, но после долгой борьбы я смог исправить это, сбросив контекст управляемого объекта

[[self managedObjectContext] reset];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...