Как лучше всего использовать Core Data для временного хранения?
Допустим, я создаю приложение, которое выбирает канал RSS для определенного веб-сайта. Пользователь может запросить статьи для New York Times, а затем закончить и запросить статьи из The Boston Globe.
Имеет смысл сохранить его в Базовых данных для меня (поправьте меня, если я ошибаюсь), так как я хочу иметь возможность легко искать и с NSFetchedResultsController
Я могу представить данные легко.
Но как мне справиться с тем, что я не хочу держать вещи вокруг навсегда? В приведенном выше примере, когда пользователь запрашивает The Boston Globe, мне больше не нужно хранить данные в New York Times, и на самом деле раздражает, когда NSFetchedResultsController
просит что показать и все еще в магазине.
3 ответа
Одна проблема, которую я вижу при использовании Core Data для временного хранения, - это очистка. Базовые данные не предоставляют API для массового удаления строк, скажем, путем указания NSPredicate
, заставляя вас использовать циклы при удалении строк.
Тем не менее, удобство использования NSFetchedResultsController
может стоить проблем с удалением: этот ответ предоставляет решение для удаления всех данных программным способом (другой ответ, который предполагает удаление базовых файлов, может не работать в последних версиях iOS).
Если вы не возражаете против написания некоторых SQL-запросов, работа с "сырым" SQLite без использования слоя Core Data может обеспечить более чистую альтернативу, поскольку вы можете перенести удаления в хранилище с помощью очень простых команд SQL DML.
Вы должны использовать опцию хранения в памяти NSInMemoryStore
вместо Sqlite для вашего NSPersistentStoreCoordinator, если вы не хотите сохранять на диск.
Используя неологизм в веб-разработке, я бы не создавал таблицу SQL для каждого сеанса пользователя, а затем удалял бы ее, когда он / она выходил с сайта. Это было бы дорого с точки зрения использования процессора. Думайте о базовых данных в этих терминах. Используйте это для постоянных данных.
Есть аспекты вашего приложения, которые не очень понятны, но в целом я бы предпочел использовать NSDictionary для хранения данных. Затем перемещайте эти данные в NSArray, который хорошо работает с NSPredicate, при каждом запуске поиска.
Теперь, если ваш конкретный случай и вы считаете, что Core Data добавит производительность или UX-значение вашему приложению, то вы можете вставить объекты в Core Data и удалить их, когда applicationDidEnterBackground
или же applicationWillTerminate
,
[NSEntityDescription insertNewObjectForEntityForName:@"feed" inManagedObjectContext:context];
[context deleteObject:aManagedObject];
Это мои 2 цента.