Как быстро очистить Core Data, если мне нужно заменить в нем все данные?

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

В некоторых случаях я загружаю контроллер представления и получаю данные из API, а также заполняю основные данные объектами ответа API, которые затем заполняют контроллер представления через NSFetchedResultsController.

Однако затем я перейду к другому контроллеру представления, совершенно не нуждающемуся в предыдущем, и сделаю новый вызов API, и мне нужно будет заполнить основные данные этими объектами ответа.

Моя проблема в том, что когда я вношу новые, мои старые все еще там. Как мне быстро сказать, чтобы старые исчезли и уступили место только новым?

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

Есть ли лучший способ сделать это?


person user212541    schedule 21.04.2014    source источник
comment
Перейдите по этой ссылке, надеюсь, она поможет вам stackoverflow .com/questions/14727583/   -  person Pandey_Laxman    schedule 21.04.2014


Ответы (2)


Поскольку вы используете хранилище в памяти, вы можете пропустить все шаги, описанные людьми для очистки постоянных хранилищ. Хранилища в памяти — это объекты, поэтому вы избавляетесь от них так же, как избавляетесь от любого другого объекта, т. е. путем установки любых ссылок на объект в nil и предоставления ARC позаботиться об их очистке. Затем вы можете создать совершенно новый магазин, в котором нет данных, и работать с ним.

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

Самый простой подход с хранилищем в памяти:

  1. Установите для любых ссылок на любой объект, связанный с постоянным хранилищем, значение nil. Сюда входят все управляемые объекты, контекст управляемого объекта, а также постоянное хранилище и координатор постоянного хранилища.

  2. Создайте новое постоянное хранилище, координатор постоянного хранилища и контекст управляемого объекта. Сделайте это так же, как вы создали его в первый раз.

Нет шага 3, и нет необходимости явно удалять все содержимое постоянного хранилища.

person Tom Harrington    schedule 21.04.2014
comment
Кроме того, зачем мне постоянное хранилище, если я не сохраняю на диск? - person user212541; 24.04.2014
comment
У вас есть постоянное хранилище, потому что так работает Core Data. Хранилище в памяти по-прежнему является постоянным хранилищем. У меня нет примеров кода, как установить переменную в нулевое значение, извините. - person Tom Harrington; 24.04.2014

Вот как я сбрасываю основные данные:

//  reset core data
[managedObjectContext lock];

NSPersistentStoreCoordinator *persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator;

for(NSPersistentStore *persistentStore in persistentStoreCoordinator.persistentStores) 
{
    [persistentStoreCoordinator removePersistentStore:persistentStore error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:persistentStore.URL.path error:nil];
}

[managedObjectContext unlock];

Я использую это мое приложение, чтобы все очистить и начать все сначала. Надеюсь, это то, что вы ищете. Извините, если это не так.

person Infinity James    schedule 21.04.2014
comment
В iOS 7 это оставит много дополнительных данных, если только вы ранее не изменили режим журнала SQLite на удаление. По умолчанию в том же каталоге есть файл wal (который может быть очень большим) и файл shm. - person Tom Harrington; 21.04.2014