Знаете ли вы какой-либо способ удалить все записи, хранящиеся в Core Data? Моя схема должна остаться прежней; Я просто хочу сбросить его до пустого.
редактировать
Я хочу сделать это программно, чтобы пользователь мог по существу нажать reset
кнопку.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Михаил Гринич
источник
источник
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Ответы:
Вы все еще можете удалить файл программно, используя NSFileManager: removeItemAtPath :: method.
Затем просто добавьте постоянное хранилище обратно, чтобы убедиться, что оно воссоздано правильно.
Программный способ перебора каждой сущности медленнее и подвержен ошибкам. Это можно сделать, если вы хотите удалить некоторые объекты, а не другие. Однако вы все равно должны убедиться, что сохраняете ссылочную целостность, иначе вы не сможете сохранить свои изменения.
Простое удаление и воссоздание хранилища является быстрым и безопасным, и, безусловно, может быть сделано программно во время выполнения.
Обновление для iOS5 +
С введением внешнего двоичного хранилища (allowExternalBinaryDataStorage или Store in External Record File) в iOS 5 и OS X 10.7 простого удаления файлов, указанных в storeURL, стало недостаточно. Вы оставите внешние файлы записи позади. Поскольку схема именования этих внешних файлов записи не является общедоступной, у меня пока нет универсального решения. - до 8 мая '12 в 23:00
источник
Вы можете удалить файл SQLite, но я решил сделать это, очистив таблицы индивидуально с помощью функций:
Причина, по которой я решил сделать это таблица за таблицей, заключается в том, что во время программирования я подтверждаю, что удаление содержимого таблицы является разумным и нет данных, которые я бы предпочел хранить.
Делать это будет намного медленнее, чем просто удалить файл, и я перейду на удаление файла, если этот метод займет слишком много времени.
источник
Обновленное решение для iOS 10+
Используйте
NSBatchDeleteRequest
для удаления всех объектов в объекте без необходимости загружать их в память или выполнять итерацию по ним.Этот код был обновлен для iOS 10 и Swift 3. Если вам нужна поддержка iOS 9, посмотрите этот вопрос .
Источники:
источник
moc.performBlockAndWait({ () -> Void in
...})
.Я написал
clearStores
метод, который проходит через каждое хранилище и удаляет его как из координатора, так и из файловой системы (обработка ошибок оставлена в стороне):Этот метод находится внутри
coreDataHelper
класса, который заботится (помимо прочего) о создании persistentStore, когда он равен nil.источник
Я удаляю все данные из основных данных кнопки Event в классе HomeViewController: эта статья мне очень помогла, и я решила, что внесу свой вклад.
Обратите внимание, что для вызова self.persistentStoreCoordinator я объявил свойство в Home View Controller. (Не беспокойтесь по поводу управляемогоObjectContext, который я использую для сохранения и загрузки.)
Затем в AppDelegate ApplicationDidFinishLaunching прямо ниже создания HomeViewController у меня есть:
источник
MagicalRecord делает это очень легко.
источник
MR_truncateAll
их?iOS9 +, Swift 2
Удалить все объекты во всех объектах
источник
[Поздний ответ в ответ на награду за новые ответы]
Просматривая предыдущие ответы,
Но есть другой, похожий подход к удалению постоянного хранилища, которое работает. Ключ должен поместить ваш постоянный файл хранилища в его собственный подкаталог, который не содержит ничего другого. Не просто вставьте его в каталог документов (или где-либо еще), создайте новый подкаталог только для постоянного хранилища. Содержимое этого каталога в конечном итоге станет файлом постоянного хранилища, файлами журнала и внешними двоичными файлами. Если вы хотите уничтожить все хранилище данных, удалите этот каталог, и все они исчезнут.
Вы бы сделали что-то подобное при настройке вашего постоянного магазина:
Затем, когда вы хотели удалить магазин,
Это рекурсивно удаляет как пользовательский подкаталог, так и все файлы базовых данных в нем.
Это работает, только если у вас нет постоянного хранилища в той же папке, что и другие важные данные . Как каталог документов, в котором, вероятно, есть другие полезные вещи. Если это ваша ситуация, вы можете получить тот же эффект, глядя на файлы , которые вы действительно хотите сохранить и удалить все остальное. Что-то вроде:
Этот подход может быть подвержен ошибкам . Вы должны быть абсолютно уверены, что знаете каждый файл, который хотите сохранить, потому что в противном случае вы можете удалить важные данные. С другой стороны, вы можете удалить внешние двоичные файлы, фактически не зная имени файла / каталога, используемого для их хранения.
источник
Вот комбинированное решение для очистки Core Data.
источник
Если вы хотите удалить все объекты и не хотите удалять файлы поддержки, вы можете использовать следующие методы:
Помните, что это может быть очень медленно (зависит от того, сколько объектов находится в вашем графе объектов).
источник
Если вы хотите пойти по пути удаления всех объектов (что гораздо проще, чем разорвать стек основных данных, но менее производительно), то это лучшая реализация:
Эта реализация использует
NSOperation
для удаления основного потока и уведомления о завершении. Возможно, вы захотите отправить уведомление или что-то в блоке завершения, чтобы отправить статус обратно в главный поток.источник
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
для того, чтобы использовать этот метод, иначе вы получите ошибку:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Решение iOS 10 + Swift 3:
Перебирает все основные объекты данных и очищает их
источник
Спасибо за пост. Я следовал за этим, и это работало на меня. Но у меня была другая проблема, которая не упоминалась ни в одном из ответов. Так что я не уверен, что это был только я.
Во всяком случае, думал, что я опубликую здесь проблему и мой путь, который решил ее.
У меня было несколько записей в базе данных, я хотел очистить все, прежде чем записывать новые данные в БД, поэтому я сделал все, включая
и затем использовался
managedObjectContext
для доступа к базе данных (которая должна быть пустой сейчас), каким-то образом данные все еще были там. Через некоторое время устранения неполадок, я обнаружил , что мне нужно сброситьmanagedObjectContext
,managedObject
,managedObjectModel
иpersistentStoreCoordinator
, прежде чем я использоватьmanagedObjectContext
для доступа к dabase. Теперь у меня есть чистая база данных для записи.источник
Вот несколько упрощенная версия с меньшим количеством обращений к самому AppDelegate и последним кусочком кода, который остался за пределами рейтинга. Также я получаю сообщение об ошибке «Постоянное хранилище объекта недоступно из этого координатора NSManagedObjectContext», поэтому просто необходимо добавить его обратно.
источник
быстрое решение:
источник
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
В качестве краткого справочника для сохранения поиска в другом месте - воссоздание постоянного хранилища после удаления может быть выполнено с помощью:
источник
Несколько хороших ответов на этот вопрос. Вот хороший краткий. Первые две строки удаляют базу данных sqlite. Затем цикл for: удаляет все объекты в памяти managedObjectContext.
источник
Вы также можете найти все имена сущностей и удалить их по имени. Это более длинная версия, но работает хорошо, так что вам не нужно работать с сохранением хранилища
для "Any_Entity_Name" просто укажите любое имя вашей сущности, нам нужно только выяснить описание сущности, в которой находятся ваши сущности. ValueForKey @ "name" вернет все имена сущностей. Наконец, не забудьте сохранить.
источник
Принятый ответ правильный с удалением URL с помощью NSFileManager, но как указано в iOS 5+ edit, постоянное хранилище не представлено только одним файлом. Для хранилища SQLite это * .sqlite, * .sqlite-shm и * .sqlite-wal ... к счастью, начиная с iOS 7+ мы можем использовать метод
[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL: параметры: ошибка:]
позаботиться об удалении, поэтому код должен быть примерно таким:
источник
Вот версия, которая удаляет каждую запись в каждой вашей таблице.
Swift 4
источник
Swift 4/5, iOS 9+
Перестройка всего
CoreData
файла SQLite обеспечит удаление всех данных, поэтому все объекты будут удалены. Просто позвониdeleteAndRebuild()
.источник
Работает со всеми версиями. Передайте имя сущности и выполните итерацию, чтобы удалить все записи и сохранить контекст.
источник
Еще один метод (помимо запроса на удаление пакета), который я часто использую (в зависимости от требований приложения), - сброс постоянного хранилища. Реализация выглядит следующим образом для iOS 10+ и Swift (при условии, что у вас есть класс CoreDataManager):
Одним из преимуществ этого метода является то, что он более прост, особенно когда у вас есть множество записей для многочисленных объектов в ваших основных данных. В этом случае пакетный запрос на удаление будет интенсивно использовать память.
источник
Решение Swift 5.1
источник
Удалить файл постоянного хранилища и настроить новый координатор постоянного хранилища?
источник
Удалите sqlite из вашего файла ULPath, а затем соберите.
источник
Предполагая, что вы используете
MagicalRecord
и сохраняете хранилище по умолчанию:Мне не нравятся все решения, которые предполагают существование определенных файлов и / или требуют ввода имен или классов сущностей. Это Swift (2), безопасный способ удалить все данные из всех сущностей. После удаления он также создаст новый стек (я на самом деле не уверен, насколько эта часть необходима).
Это идеальный вариант для ситуаций, связанных с выходом из системы, когда вы хотите удалить все, но у вас есть работающее хранилище и moc для ввода новых данных (когда пользователь входит в систему ...)
источник
Использовать это
источник
Я взял код Grouchal и, чтобы ускорить его, я использовал перечисление с параллельным режимом (
NSEnumerationConcurrent
), он стал немного быстрее по сравнению с циклом for (в моем приложении я добавил эту функцию для тестировщиков, чтобы они могли очищать данные и выполнять тестовые случаи, а не удалять и установить приложение)источник
здесь моя версия swift3 для удаления всех записей. «Пользователи» - это имя объекта
источник