удалить/сбросить все записи в базовых данных?

<p>знаете ли вы какой-либо способ удалить все записи, хранящиеся в основных данных? моя схема должна остаться прежней; я просто хочу сбросить его до пустого.</p><hr><p><strong> правка </strong></p><p>я пытаюсь сделать это программно, чтобы пользователь мог по существу нажать кнопку <code>reset</code>.</p>

<p>вы все еще можете удалить файл программно, используя nsfilemanager: removeitematpath :: method.</p><pre><code>nspersistentstore *store = ...; nserror *error; nsurl *storeurl = store.url; nspersistentstorecoordinator *storecoordinator = ...; [storecoordinator removepersistentstore:store error:&error]; [[nsfilemanager defaultmanager] removeitematpath:storeurl.path error:&error]; </code></pre><p>затем просто добавьте постоянное хранилище обратно, чтобы убедиться, что оно воссоздано правильно.</p><p>программный способ перебора каждой сущности медленнее и подвержен ошибкам. это можно сделать, если вы хотите удалить некоторые объекты, а не другие. однако вы все равно должны убедиться, что сохраняете ссылочную целостность, иначе вы не сможете сохранить свои изменения.</p><p>простое удаление и воссоздание хранилища является быстрым и безопасным, и, безусловно, может быть сделано программно во время выполнения.</p><p><strong> обновление для ios5 + </strong></p><p>с введением внешнего двоичного хранилища (allowexternalbinarydatastorage или store in external record file) в ios 5 и os x 10.7 простого удаления файлов, указанных в storeurl, стало недостаточно. вы оставите внешние файлы записи позади. поскольку схема именования этих внешних файлов записи не является общедоступной, у меня пока нет универсального решения. - до 8 мая '12 в 23:00</p>

<p>вы можете удалить файл sqlite, но я решил сделать это, очистив таблицы индивидуально с помощью функций:</p><pre><code>- (void) deleteallobjects: (nsstring *) entitydescription { nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; nsentitydescription *entity = [nsentitydescription entityforname:entitydescription inmanagedobjectcontext:\_managedobjectcontext]; [fetchrequest setentity:entity]; nserror *error; nsarray *items = [\_managedobjectcontext executefetchrequest:fetchrequest error:&error]; [fetchrequest release]; for (nsmanagedobject *managedobject in items) { [\_managedobjectcontext deleteobject:managedobject]; dlog(@"%@ object deleted",entitydescription); } if (![\_managedobjectcontext save:&error]) { dlog(@"error deleting %@ - error:%@",entitydescription,error); } } </code></pre><p>причина, по которой я решил сделать это таблица за таблицей, заключается в том, что при программировании я подтверждаю, что удаление содержимого таблицы является разумным, и нет данных, которые я бы предпочел хранить.</p><p>делать это будет намного медленнее, чем просто удалить файл, и я перейду на удаление файла, если этот метод займет слишком много времени.</p>

<h1>обновленное решение для ios 9+</h1><p>используйте <code>nsbatchdeleterequest</code>, чтобы удалить все объекты в сущности, не загружая их в память или не просматривая их.</p><pre><code>// create the delete request for the specified entity let fetchrequest = nsfetchrequest<nsfetchrequestresult>(entityname: "myentity") let deleterequest = nsbatchdeleterequest(fetchrequest: fetchrequest) // get reference to the persistent container let persistentcontainer = (uiapplication.shared.delegate as! appdelegate).persistentcontainer // perform the delete do { try persistentcontainer.viewcontext.execute(deleterequest) } catch let error as nserror { print(error) } </code></pre><p><em>этот код был обновлен для ios 10 и swift 3. если вам нужна поддержка ios 9, см. <a href="https://stackoverflow.com/questions/39924722/nsbatchdeleterequest-in-swift-3-for-ios-10-only">этот вопрос</a> .</em></p><p><strong>источники:</strong> </p><ul> <li> <a href="https://stackoverflow.com/a/1383645/3681880">базовые данные: самый быстрый способ удалить все экземпляры объекта</a> (включает код objective-c)</li> <li> <a href="https://developer.apple.com/videos/wwdc/2015/?id=220">что нового в основных данных</a> (видео wwdc 2015)</li> <li> <a href="https://developer.apple.com/videos/play/wwdc2016/242/">что нового в основных данных</a> (видео wwdc 2016)</li> <li> <a href="https://learnappdevelopment.com/uncategorized/how-to-use-core-data-in-ios-10-swift-3/">как использовать базовые данные в ios 10</a> </li> <li> <a href="https://www.jayway.com/2016/08/12/whats-new-core-data-swift-3-0/">что нового в core data swift 3.0</a> </li> </ul>

<p>я написал метод <code>clearstores</code>, который проходит через каждое хранилище и удаляет его как из координатора, так и из файловой системы (обработка ошибок оставлена в стороне):</p><pre><code>nsarray *stores = [persistentstorecoordinator persistentstores]; for(nspersistentstore *store in stores) { [persistentstorecoordinator removepersistentstore:store error:nil]; [[nsfilemanager defaultmanager] removeitematpath:store.url.path error:nil]; } [persistentstorecoordinator release], persistentstorecoordinator = nil; </code></pre><p>этот метод находится внутри класса <code>coredatahelper</code>, который заботится (помимо прочего) о создании persistentstore, когда он равен nil. </p>

<p>я удаляю все данные из основных данных кнопки event в классе homeviewcontroller: эта статья мне очень помогла, и я решила, что внесу свой вклад.</p><pre><code>-(ibaction)buttonreset:(id)sender { nslog(@"buttonreset pressed"); //erase the persistent store from coordinator and also file manager. nspersistentstore *store = [self.persistentstorecoordinator.persistentstores lastobject]; nserror *error = nil; nsurl *storeurl = store.url; [self.persistentstorecoordinator removepersistentstore:store error:&error]; [[nsfilemanager defaultmanager] removeitematurl:storeurl error:&error]; nslog(@"data reset"); //make new persistent store for future saves (taken from above answer) if (![self.persistentstorecoordinator addpersistentstorewithtype:nssqlitestoretype configuration:nil url:storeurl options:nil error:&error]) { // do something with the error } } </code></pre><p>обратите внимание, что для вызова self.persistentstorecoordinator я объявил свойство в home view controller. (не беспокойтесь по поводу управляемогоobjectcontext, который я использую для сохранения и загрузки.)</p><pre><code>@property (nonatomic, retain) nsmanagedobjectcontext * managedobjectcontext; @property (nonatomic, retain) nspersistentstorecoordinator * persistentstorecoordinator; </code></pre><p>затем в appdelegate applicationdidfinishlaunching прямо ниже создания homeviewcontroller у меня есть:</p><pre><code>homeviewcontroller = [[homeviewcontroller alloc] initwithnibname:@"homeviewcontroller" bundle:nil]; homeviewcontroller.managedobjectcontext = self.managedobjectcontext; homeviewcontroller.persistentstorecoordinator = self.persistentstorecoordinator; </code></pre>

<p> <a href="https://github.com/magicalpanda/magicalrecord">magicalrecord</a> делает это очень легко.</p><pre><code>[mycoredataobject mr\_truncateall]; </code></pre>

<p>ios9 +, swift 2</p><p>удалить все объекты во всех объектах</p><pre><code>func clearcoredatastore() { let entities = managedobjectmodel.entities for entity in entities { let fetchrequest = nsfetchrequest(entityname: entity.name!) let deletereqest = nsbatchdeleterequest(fetchrequest: fetchrequest) do { try context.executerequest(deletereqest) } catch { print(error) } } } </code></pre>

<p><em>[поздний ответ в ответ на щедрость, требующую новых ответов]</em></p><p>просматривая предыдущие ответы,</p><ul> <li>выборка и удаление всех элементов, как предлагает @grouchal и другие, по-прежнему является эффективным и полезным решением. если у вас очень большие хранилища данных, то это может быть медленно, но все равно работает очень хорошо.</li> <li>как вы и @groundhog отмечаете, простое удаление хранилища данных уже не эффективно. он устарел<strong> даже если вы не используете внешнее двоичное хранилище </strong>потому что ios 7 использует режим wal для журналирования sqlite. в режиме wal могут храниться (потенциально большие) файлы журналов для любого постоянного хранилища core data.</li> </ul><p>но есть другой, похожий подход к удалению постоянного хранилища, которое работает. ключ должен поместить ваш постоянный файл хранилища в его собственный подкаталог, который не содержит ничего другого. не просто вставьте его в каталог документов (или где-либо еще), создайте новый подкаталог только для постоянного хранилища. содержимое этого каталога в конечном итоге станет файлом постоянного хранилища, файлами журнала и внешними двоичными файлами. если вы хотите уничтожить все хранилище данных, удалите этот каталог, и все они исчезнут.</p><p>вы бы сделали что-то подобное при настройке вашего постоянного магазина:</p><pre><code>nsurl *storedirectoryurl = [[self applicationdocumentsdirectory] urlbyappendingpathcomponent:@"persistent-store"]; if ([[nsfilemanager defaultmanager] createdirectoryaturl:storedirectoryurl withintermediatedirectories:no attributes:nil error:nil]) { nsurl *storeurl = [storedirectoryurl urlbyappendingpathcomponent:@"myapp.sqlite"]; // continue with storeurl as usual... } </code></pre><p>затем, когда вы хотели удалить магазин,</p><pre><code>[[nsfilemanager defaultmanager] removeitematurl:storedirectoryurl error:nil]; </code></pre><p>это рекурсивно удаляет как пользовательский подкаталог, так и все файлы базовых данных в нем.</p><p><strong> это работает, только если у вас нет постоянного хранилища в той же папке, что и другие важные данные </strong>. как каталог документов, в котором, вероятно, есть другие полезные вещи. если это ваша ситуация, вы можете получить тот же эффект, найдя файлы, которые вы<strong> делаете </strong>хотите сохранить, и удалив все остальное. что-то вроде:</p><pre><code>nsstring *docsdirectorypath = [[self applicationdocumentsdirectory] path]; nsarray *docsdirectorycontents = [[nsfilemanager defaultmanager] contentsofdirectoryatpath:docsdirectorypath error:nil]; for (nsstring *docsdirectoryitem in docsdirectorycontents) { // look at docsdirectoryitem. if it's something you want to keep, do nothing. // if it's something you don't recognize, remove it. } </code></pre><p><strong> этот подход может быть подвержен ошибкам </strong>. вы должны быть абсолютно уверены, что знаете<strong> каждый </strong>файл, который хотите сохранить, потому что в противном случае вы можете удалить важные данные. с другой стороны, вы можете удалить внешние двоичные файлы, фактически не зная имени файла/каталога, используемого для их хранения.</p>

<p>вот комбинированное решение для очистки core data.</p><pre><code>- (void)deleteallobjectsincoredata { nsarray *allentities = self.managedobjectmodel.entities; for (nsentitydescription *entitydescription in allentities) { nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; [fetchrequest setentity:entitydescription]; fetchrequest.includespropertyvalues = no; fetchrequest.includessubentities = no; nserror *error; nsarray *items = [self.managedobjectcontext executefetchrequest:fetchrequest error:&error]; if (error) { nslog(@"error requesting items from core data: %@", [error localizeddescription]); } for (nsmanagedobject *managedobject in items) { [self.managedobjectcontext deleteobject:managedobject]; } if (![self.managedobjectcontext save:&error]) { nslog(@"error deleting %@ - error:%@", entitydescription, [error localizeddescription]); } } } </code></pre>

<p>если вы хотите удалить все объекты и не хотите удалять файлы поддержки, вы можете использовать следующие методы:</p><pre><code>- (void)deleteallobjectsincontext:(nsmanagedobjectcontext *)context usingmodel:(nsmanagedobjectmodel *)model { nsarray *entities = model.entities; for (nsentitydescription *entitydescription in entities) { [self deleteallobjectswithentityname:entitydescription.name incontext:context]; } } - (void)deleteallobjectswithentityname:(nsstring *)entityname incontext:(nsmanagedobjectcontext *)context { nsfetchrequest *fetchrequest = [nsfetchrequest fetchrequestwithentityname:entityname]; fetchrequest.includespropertyvalues = no; fetchrequest.includessubentities = no; nserror *error; nsarray *items = [context executefetchrequest:fetchrequest error:&error]; for (nsmanagedobject *managedobject in items) { [context deleteobject:managedobject]; nslog(@"deleted %@", entityname); } } </code></pre><p>помните, что это может быть очень медленно (зависит от того, сколько объектов находится в вашем графе объектов).</p>

<p>если вы хотите пойти по пути удаления всех объектов (что гораздо проще, чем разбить стек основных данных, но менее производительно), то это будет лучшая реализация:</p><pre><code>- (void)deleteallmanagedobjectsinmodel:(nsmanagedobjectmodel *)managedobjectmodel context:(nsmanagedobjectcontext *)managedobjectcontext { nsblockoperation *operation = [nsblockoperation blockoperationwithblock:^{ [managedobjectcontext performblockandwait:^{ for (nsentitydescription *entity in managedobjectmodel) { nsfetchrequest *fetchrequest = [nsfetchrequest new]; [fetchrequest setentity:entity]; [fetchrequest setincludessubentities:no]; nsarray *objects = [managedobjectcontext executefetchrequest:fetchrequest error:nil]; for (nsmanagedobject *managedobject in objects) { [managedobjectcontext deleteobject:managedobject]; } } [managedobjectcontext save:nil]; }]; }]; [operation setcompletionblock:^{ // do stuff once the truncation is complete }]; [operation start]; } </code></pre><p>эта реализация использует <code>nsoperation</code> для удаления из основного потока и уведомления о завершении. возможно, вы захотите отправить уведомление или что-то в блоке завершения, чтобы отправить статус обратно в главный поток.</p>

<p>решение ios 10 + swift 3:</p><pre><code>func clearcoredatastore() { let delegate = uiapplication.shared.delegate as! appdelegate let context = delegate.persistentcontainer.viewcontext for i in 0...delegate.persistentcontainer.managedobjectmodel.entities.count-1 { let entity = delegate.persistentcontainer.managedobjectmodel.entities[i] do { let query = nsfetchrequest<nsfetchrequestresult>(entityname: entity.name!) let deleterequest = nsbatchdeleterequest(fetchrequest: query) try context.execute(deleterequest) try context.save() } catch let error as nserror { print("error: \(error.localizeddescription)") abort() } } } </code></pre><p>перебирает все основные объекты данных и очищает их</p>

<p>быстрое решение:</p><pre><code>class func deleteallmanagedobjects() { let modelurl = nsbundle.mainbundle().urlforresource("some string", withextension: "mom") let mom = nsmanagedobjectmodel(contentsofurl: modelurl) for entityname in mom.entitiesbyname.keys { let fr = nsfetchrequest(entityname: entityname as string) let a = utility.managedobjectcontext().executefetchrequest(fr, error: nil) as [nsmanagedobject] for mo in a { utility.managedobjectcontext().deleteobject(mo) } } utility.managedobjectcontext().save(nil) } </code></pre>

<p>вот несколько упрощенная версия с меньшим количеством обращений к самому appdelegate и последним фрагментом кода, который был оставлен вне рейтинга с самым высоким рейтингом. также я получаю сообщение об ошибке «постоянное хранилище объекта недоступно из этого координатора nsmanagedobjectcontext», поэтому просто необходимо добавить его обратно.</p><pre><code>nspersistentstorecoordinator *storecoordinator = [self persistentstorecoordinator]; nspersistentstore *store = [[storecoordinator persistentstores] lastobject]; nsurl *storeurl = [[self applicationdocumentsdirectory] urlbyappendingpathcomponent:@"datamodel"]; nserror *error; [storecoordinator removepersistentstore:store error:&error]; [[nsfilemanager defaultmanager] removeitematpath:storeurl.path error:&error]; [\_persistentstorecoordinator addpersistentstorewithtype:nssqlitestoretype configuration:nil url:storeurl options:nil error:&error]; if (storecoordinator != nil) { \_managedobjectcontext = [[nsmanagedobjectcontext alloc] init]; [\_managedobjectcontext setpersistentstorecoordinator:storecoordinator]; } </code></pre>

<p>спасибо за пост. я следовал за этим, и это работало на меня. но у меня была другая проблема, которая не была упомянута ни в одном из ответов. так что я не уверен, что это был только я. </p><p>во всяком случае, думал, что я опубликую здесь проблему и мой путь, который решил ее.</p><p>у меня было несколько записей в базе данных, я хотел очистить все, прежде чем записывать новые данные в бд, поэтому я сделал все, включая </p><pre><code>[[nsfilemanager defaultmanager] removeitematurl:storeurl error:&error]; </code></pre><p>и затем использовал <code>managedobjectcontext</code> для доступа к базе данных (которая должна быть пустой сейчас), так или иначе данные все еще были там. после некоторого времени устранения неполадок я обнаружил, что мне нужно сбросить <code>managedobjectcontext</code>, <code>managedobject</code>, <code>managedobjectmodel</code> и <code>persistentstorecoordinator</code>, прежде чем использовать <code>managedobjectcontext</code> для доступа к базе данных. теперь у меня есть чистая база данных для записи. </p>

<p>несколько хороших ответов на этот вопрос. вот хороший лаконичный. первые две строки удаляют базу данных sqlite. затем цикл for: удаляет все объекты в памяти managedobjectcontext.</p><pre><code>nsurl *storeurl = [[(fxyappdelegate*)[[uiapplication sharedapplication] delegate] applicationdocumentsdirectory] urlbyappendingpathcomponent:@"appname.sqlite"]; [[nsfilemanager defaultmanager] removeitematurl:storeurl error:nil]; for (nsmanagedobject *ct in [self.managedobjectcontext registeredobjects]) { [self.managedobjectcontext deleteobject:ct]; } </code></pre>

<p>в качестве краткого справочника для сохранения поиска в другом месте - воссоздание постоянного хранилища после удаления может быть выполнено с помощью:</p><pre><code>if (![persistentstorecoordinator addpersistentstorewithtype:nssqlitestoretype configuration:nil url:storeurl options:nil error:&error]) { // do something with the error } </code></pre>

<p>принятый ответ правильный с удалением url с помощью nsfilemanager, но как указано в ios 5+ edit, постоянное хранилище не представлено только одним файлом. для хранилища sqlite это * .sqlite, * .sqlite-shm и * .sqlite-wal ... к счастью, начиная с ios 7+ мы можем использовать метод </p><p> <a href="https://developer.apple.com/library/mac/documentation/cocoa/reference/coredataframework/classes/nspersistentstorecoordinator\_class/index.html#//apple\_ref/occ/clm/nspersistentstorecoordinator/removeubiquitouscontentandpersistentstoreaturl:options:error:">[nspersistentstorecoordinator + removeubiquitouscontentandpersistentstoreaturl: параметры: ошибка:]</a> </p><p>позаботиться об удалении, поэтому код должен быть примерно таким:</p><pre><code>nspersistentstore *store = ...; nserror *error; nsurl *storeurl = store.url; nsstring *storename = ...; nspersistentstorecoordinator *storecoordinator = ...; [storecoordinator removepersistentstore:store error:&error]; [nspersistentstorecoordinator removeubiquitouscontentandpersistentstoreaturl:storeurl.path options:@{nspersistentstoreubiquitouscontentnamekey: storename} error:&error]; </code></pre>

<p>вы также можете найти все имена сущностей и удалить их по имени. это более длинная версия, но работает хорошо, так что вам не нужно работать с сохранением хранилища</p><pre><code> - (void)clearcoredata { nserror *error; nsentitydescription *des = [nsentitydescription entityforname:@"any\_entity\_name" inmanagedobjectcontext:\_managedobjectcontext]; nsmanagedobjectmodel *model = [des managedobjectmodel]; nsarray *entitynames = [[model entities] valueforkey:@"name"]; for (nsstring *entityname in entitynames){ nsfetchrequest *deleteall = [nsfetchrequest fetchrequestwithentityname:entityname]; nsarray *matches = [self.database.managedobjectcontext executefetchrequest:deleteall error:&error]; } if (matches.count > 0){ for (id obj in matches){ [\_managedobjectcontext deleteobject:obj]; } [self.database.managedobjectcontext save:&error]; } } </code></pre><p>для "any\_entity\_name" просто укажите любое имя вашей сущности, нам нужно только выяснить описание сущности, в которой находятся ваши сущности. valueforkey @ "name" вернет все имена сущностей. наконец, не забудьте сохранить.</p>

<p>использовать этот</p><pre><code>+(nsarray *)fetchdatafromentity:(nsstring *)entityname context:(nsmanagedobjectcontext *)context { nsfetchrequest * fetchrequest =[[nsfetchrequest alloc] init]; nsentitydescription * categoriesentity = [nsentitydescription entityforname:entityname inmanagedobjectcontext:context]; [fetchrequest setentity:categoriesentity]; nserror * error; nsinteger count = [context countforfetchrequest:fetchrequest error:&error]; if (count && count>0) { nsarray * fetchedobjects = [context executefetchrequest:fetchrequest error:&error]; if (fetchedobjects && fetchedobjects.count>0) { return fetchedobjects; }else return nil; } else return nil; } + (void)deleteobjectsofarray:(nsmutablearray*)ary context:(nsmanagedobjectcontext *)context { for (nsmanagedobject * obj in ary) { [context deleteobject:obj]; } nserror *saveerror = nil; [context save:&saveerror]; } + (void)deleteentity:(nsstring *)entityname context:(nsmanagedobjectcontext *)context { nsarray *listarray = [self fetchdatafromentity:entityname context:context]; [self deleteobjectsofarray:[nsmutablearray arraywitharray:listarray] context:context]; } </code></pre>

<p>вот версия, которая удаляет каждую запись в каждой вашей таблице.</p><p><strong> swift 4 </strong></p><pre><code>static func resetdatabase() { do { try datastore.persistentstorecoordinator.managedobjectmodel.entities.foreach { (entity) in if let name = entity.name { let fetch = nsfetchrequest<nsfetchrequestresult>(entityname: name) let request = nsbatchdeleterequest(fetchrequest: fetch) try maincontext.execute(request) } } try maincontext.save() } catch { print("error resenting the database: \(error.localizeddescription)") } } </code></pre>

<p>удалить файл постоянного хранилища и настроить новый координатор постоянного хранилища?</p>

<p>я взял код grouchal и для его ускорения использовал перечисление с параллельным режимом (<code>nsenumerationconcurrent</code>), он стал немного быстрее по сравнению с циклом for (в моем приложении я добавил эту функцию для тестировщиков, чтобы они могли очищать данные и выполнять тестовые случаи, а не удалять и установить приложение)</p><pre><code>- (void)resetobjects { [self deleteallobjectsinentity:@"entity1"]; [self deleteallobjectsinentity:@"entity2"]; [self deleteallobjectsinentity:@"entity3"]; [self deleteallobjectsinentity:@"entity4"]; } -(void) deleteallobjectsinentity:(nsstring*) entityname { maindatacontext *coredatacontext = [maindatacontext sharedinstance]; nsmanagedobjectcontext *currentcontext = coredatacontext.managedobjectcontext; nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; nsentitydescription *entity = [nsentitydescription entityforname:entityname inmanagedobjectcontext:currentcontext]; [fetchrequest setentity:entity]; nserror *error; nsarray *items = [currentcontext executefetchrequest:fetchrequest error:&error]; [items enumerateobjectswithoptions:nsenumerationconcurrent usingblock:^(nsmanagedobject * obj, nsuinteger idx, bool *stop) { [currentcontext deleteobject:obj]; }]; if (![currentcontext save:&error]) { nslog(@"error deleting %@ - error:%@",entityname,error); } } </code></pre>

<p>предполагая, что вы используете <code>magicalrecord</code> и у вас есть постоянное хранилище по умолчанию:</p><p>мне не нравятся все решения, которые предполагают существование определенных файлов и/или требуют ввода имен или классов сущностей. это swift (2), безопасный способ удалить все данные из всех сущностей. после удаления он также создаст новый стек (я на самом деле не уверен, насколько необходима эта часть). </p><p>это идеальное решение для ситуаций, связанных с выходом из системы, когда вы хотите удалить все, но у вас есть работающее хранилище и moc для ввода новых данных (как только пользователь входит в систему ...)</p><pre><code>extension nsmanagedobject { class func dropalldata() { magicalrecord.savewithblock({ context in for name in nsmanagedobjectmodel.mr\_defaultmanagedobjectmodel().entitiesbyname.keys { do { try self.deleteall(name, context: context) } catch { print("⚠️ ✏️ error when deleting \(name): \(error)") } } }) { done, err in magicalrecord.cleanup() magicalrecord.setupcoredatastackwithstorenamed("mystorename") } } private class func deleteall(name: string, context ctx: nsmanagedobjectcontext) throws { let all = nsfetchrequest(entityname: name) all.includespropertyvalues = false let allobjs = try ctx.executefetchrequest(all) for obj in allobjs { obj.mr\_deleteentityincontext(ctx) } } } </code></pre>

<p>ios 10 и swift 3</p><p>предполагая, что ваше имя сущности "photo" и вы создаете класс coredatastack ...</p><pre><code> func cleardata() { do { let context = coredatastack.sharedinstance.persistentcontainer.viewcontext let fetchrequest = nsfetchrequest<nsfetchrequestresult>(entityname: "photo") do { let objects = try context.fetch(fetchrequest) as? [nsmanagedobject] \_ = objects.map{$0.map{context.delete($0)}} coredatastack.sharedinstance.savecontext() } catch let error { print("error deleting : \(error)") } } } </code></pre><p>вот хороший учебник, как использовать coredata и как использовать этот метод . <a href="https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f#.1tu6kt8qb">https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step- by-step-fb58fc6ce16f # .1tu6kt8qb</a> </p>

<p>работает со всеми версиями. передайте имя сущности и выполните итерацию, чтобы удалить все записи и сохранить контекст.</p><pre><code>func deletedata(entitytofetch: string, completion: @escaping(\_ returned: bool) ->()) { var context = nsmanagedobjectcontext() if #available(ios 10.0, *) { context = self.persistentcontainer.viewcontext } else { context = self.managedobjectcontext } let fetchrequest = nsfetchrequest<nsfetchrequestresult>() fetchrequest.entity = nsentitydescription.entity(forentityname: entitytofetch, in: context) fetchrequest.includespropertyvalues = false do { let results = try context.fetch(fetchrequest) as! [nsmanagedobject] for result in results { context.delete(result) } try context.save() completion(true) } catch { completion(false) print("fetch error -\(error.localizeddescription)") } } </code></pre>

<p>здесь моя версия swift3 для удаления всех записей. «пользователи» - это имя объекта</p><pre><code>@ibaction func btndelall\_touchupinside(\_ sender: any) { let appdelegate = uiapplication.shared.delegate as! appdelegate let managedobjectcontext = appdelegate.persistentcontainer.viewcontext let fetchreq = nsfetchrequest<nsfetchrequestresult>(entityname: "users") let req = nsbatchdeleterequest(fetchrequest: fetchreq) do { try managedobjectcontext.execute(req) } catch { // error handling } } </code></pre>

<p>удалите sqlite из вашего файла ulpath, а затем соберите.</p>