2013-12-20 4 views
0

У меня есть RKPaginator, который загружает данные с сервера и сохраняет их в Core Data. Все это работает как шарм при загрузке и пейджинге. Тем не менее, элементы в основных данных являются постоянными, поэтому в любое время, когда я возвращаюсь в диспетчер представлений или перезапускаю приложение, все предыдущие выгружаемые данные по-прежнему находятся в базовых данных.Инициализация RKPaginator RestKit с новыми данными ядра

Я хотел бы начать с чистого листа при запуске приложения. Как я могу сообщить Core Data, чтобы очистить его содержимое? Я пробовал следующий код, но, похоже, он работает только иногда, и нерегулярно, возможно, временные ошибки из входящих данных. Я действительно очень хотел бы сбросить только тогда, когда получаю успешный ответ от моего Api-Request.

NSString *entityDescription = @"Activity"; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:weakSelf.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSError *error; 
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

for (NSManagedObject *managedObject in items) { 
    [self.managedObjectContext deleteObject:managedObject]; 
} 

Как бы это достичь?

+0

Вы сохранили этот код? Есть ли у ваших лиц дата (например, дата загрузки)? – Wain

+0

Нет, я не спас. Я сделаю это благодаря. У меня также нет даты загрузки в сущности. Это не то, что предлагает мне сервер. Должен ли я установить это после получения данных с сервера? – Alan

+0

Если вы хотите очистить после получения ответа, вам нужно каким-то образом рассказать, что нового, а что старое - все ... – Wain

ответ

1

Самый простой вариант - удалить файл хранилища основных данных с диска при запуске приложения и создать новый. Это, очевидно, не будет работать для хранения данных до тех пор, пока запрос не вернет хорошие данные.

Для этого вам нужно знать, что является старым и что нового. RestKit может сделать это за вас, но если вы загружаете постраничные данные, это не сработает (это приведет к удалению страницы, которую вы получили, когда получите новый).

Вы можете использовать код, похожий на то, что у вас есть (что должно работать), но в блоке success запроса. В блоке success у вас есть все новые элементы, поэтому вы просто проверите, был ли это первый запрос (переменная экземпляра BOOL), и, если это было, удалите все, что не было в mappingResult.

+0

Последнее решение - это то, что я хочу. Старые данные должны быть видны до тех пор, пока не появятся новые данные. Благодарю. – Alan

1

Я в очень похожей ситуации, используя RestKit и Core Data. Удаленные данные всегда являются последним источником, поэтому я хочу, чтобы Core Data «очистил» то, чего нет в удаленной БД.

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

RestKit имеет встроенные функции для обновления CoreData для вас и для удаления этих объектов в CoreData, которые больше не существуют в удаленном источнике данных (или которые больше не возвращаются API для конкретных вызовов).

Он называется «Блоки запроса запроса».

- (void)setupFetchRequestBlocksForObjectManager:(RKObjectManager*)manager 
{ 
    [manager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { 
     RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"article"]; 

     NSDictionary *argsDict = nil; 
     BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict]; 
     if (match) { 
      NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"]; 
      fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"articleId" ascending:YES] ]; 
      return fetchRequest; 
     } 
     return nil; 
    }]; 
} 

В этом примере я описываю вызов API, что это Fetch блок запроса для, а затем, описывающего запрос CoreData, который должен совпадать с ним. Любые объекты Core Data, которые не совпадают с данными, возвращаемыми вызовом API, будут изменены/удалены.

Этот пример для очень простого вызова API, но вы можете также включить Params в согласовани так, что оно соответствует только для более сложных запросов - there's a good example of that on the RestKit site.

Там также другой вопрос о SO об этом here.

+0

Вы использовали этот пример с RKPaginator? Будет ли загружать результат второй страницы при удалении данных первой страницы? – Alan

+0

Я не использую RKPaginator, но я пробовал его с вызовами API с вызовами. Вы должны быть осторожны, чтобы NSFetchRequest вернул ту же страницу, что и URL (включая параметры), который вы вызываете, - что это правильный «матч». Пример в ссылке больше подходит для соответствия параметрам запроса. Это, конечно, более сложно сделать так, но это то, для чего нужны эти блоки запросов на выбор, и, надеюсь, придет лучшая поддержка RKPaginator (если его уже нет, пожалуйста, исправьте меня, если я ошибаюсь). – siburb

+0

Мне удалось получить пример от Wain, чтобы работать неплохо, поэтому на данный момент я буду придерживаться этого. Но когда я получаю больше времени, я попробую Fetch Request Blocks, поскольку я хотел бы узнать как можно больше методов RestKit. Я снова отправлю сообщение, когда доберусь до этого. Спасибо за информацию. – Alan

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