Mic*_*ich 229 cocoa cocoa-touch core-data nsmanagedobject ios
您知道删除Core Data中存储的所有条目的方法吗?我的架构应该保持不变; 我只是想把它重置为空白.
编辑
我希望以编程方式执行此操作,以便用户可以实际按下reset按钮.
gro*_*hog 197
您仍然可以使用NSFileManager:removeItemAtPath :: method以编程方式删除该文件.
NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
Run Code Online (Sandbox Code Playgroud)
然后,只需添加持久性存储以确保正确地重新创建它.
迭代每个实体的编程方式既慢又容易出错.这样做的用途是如果你想删除一些实体而不是其他实体.但是,您仍需要确保保留参照完整性,否则您将无法保留更改.
只需删除存储并重新创建它既快又安全,并且当然可以在运行时以编程方式完成.
更新iOS5 +
通过在iOS 5和OS X 10.7中引入外部二进制存储(allowsExternalBinaryDataStorage或Store in External Record File),仅删除storeURL指向的文件是不够的.您将保留外部记录文件.由于这些外部记录文件的命名方案不公开,我还没有通用的解决方案. - an0 5月8日'12在23:00
Gro*_*hal 140
您可以删除SQLite文件 - 但我选择通过使用函数单独清除表来执行此操作:
- (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);
}
}
Run Code Online (Sandbox Code Playgroud)
我选择逐桌进行的原因是它让我确认,因为我正在进行编程,删除表的内容是明智的,并且没有我宁愿保留的数据.
这样做会比删除文件慢得多,如果这个方法花费的时间太长,我将更改为文件删除.
Sur*_*gch 56
使用NSBatchDeleteRequest以删除实体的所有对象,而无需将其加载到内存或遍历它们.
// create the delete request for the specified entity
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = MyEntity.fetchRequest()
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)
}
Run Code Online (Sandbox Code Playgroud)
此代码已针对iOS 10和Swift 3进行了更新.如果您需要支持iOS 9,请参阅此问题.
资料来源:
sam*_*tte 38
我编写了一个clearStores遍历每个商店的方法,并从协调器和文件系统中删除它(错误处理留在一边):
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;
Run Code Online (Sandbox Code Playgroud)
这个方法位于一个coreDataHelper类中,该类负责(除其他事项外)在它为零时创建persistentStore.
atr*_*eat 27
我从HomeViewController类中的按钮事件中删除核心数据中的所有数据:这篇文章帮助了我很多,我想我会做出贡献.
-(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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了调用self.persistentStoreCoordinator,我在Home View Controller中声明了一个属性.(不要担心我用于保存和加载的managedObjectContext.)
@property (nonatomic, retain) NSManagedObjectContext * managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator * persistentStoreCoordinator;
Run Code Online (Sandbox Code Playgroud)
然后在AppDelegate ApplicationDidFinishLaunching下面创建一个HomeViewController,我有:
homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;
Run Code Online (Sandbox Code Playgroud)
Bri*_*ing 21
MagicalRecord让这很容易.
[MyCoreDataObject MR_truncateAll];
Run Code Online (Sandbox Code Playgroud)
小智 16
iOS9 +,Swift 2
删除所有实体中的所有对象
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*ton 13
[对于要求更新回复的赏金的回复]
看看之前的答案,
但是有一种不同的,类似的方法来删除有效的持久存储.关键是将持久性存储文件放在不包含任何其他内容的子目录中.不要只是将它粘贴在文档目录(或任何地方),只为持久存储创建一个新的子目录.该目录的内容最终将成为持久存储文件,日志文件和外部二进制文件.如果你想要整个数据存储,删除该目录,它们都会消失.
在设置持久性存储时,您会执行以下操作:
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...
}
Run Code Online (Sandbox Code Playgroud)
然后当你想要删除商店时,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Run Code Online (Sandbox Code Playgroud)
以递归方式删除自定义子目录及其中的所有Core Data文件.
这仅适用于您尚未将持久存储与其他重要数据放在同一文件夹中的情况.就像文档目录一样,它可能还有其他有用的东西.如果这是你的情况,你可以通过查找你的文件得到相同的效果都希望保持和消除一切.就像是:
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.
}
Run Code Online (Sandbox Code Playgroud)
这种方法可能容易出错.您必须完全确定您知道要保留的每个文件,否则您可能会删除重要数据.另一方面,您可以删除外部二进制文件,而无需实际知道用于存储它们的文件/目录名称.
Gxo*_*ocT 11
这是清除核心数据的组合解决方案.
- (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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*rný 10
如果要删除所有对象但不想删除后备文件,可以使用以下方法:
- (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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意它可能非常慢(取决于对象图中有多少个对象).
如果你想删除所有对象路由(这比拆除核心数据堆栈简单得多,但性能较差),这是一个更好的实现:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
此实现利用NSOperation从主线程执行删除并在完成时通知.您可能希望在完成块中发出通知或某些内容,以将状态冒泡回主线程.
斯威夫特 4/5、iOS 9+
重建整个CoreDataSQLite 文件将确保删除所有数据,因此所有实体都被删除。就打电话吧deleteAndRebuild()。
class CoreDataStack {
// Change this
static let datamodelName = "ProjectName"
static let storeType = "sqlite"
static let persistentContainer = NSPersistentContainer(name: datamodelName)
private static let url: URL = {
let url = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0].appendingPathComponent("\(datamodelName).\(storeType)")
assert(FileManager.default.fileExists(atPath: url.path))
return url
}()
static func loadStores() {
persistentContainer.loadPersistentStores(completionHandler: { (nsPersistentStoreDescription, error) in
if let error = error {
fatalError(error.localizedDescription)
}
})
}
static func deleteAndRebuild() {
try! persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: url, ofType: storeType, options: nil)
loadStores()
}
}
Run Code Online (Sandbox Code Playgroud)
iOS 10 + Swift 3解决方案:
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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
迭代所有核心数据实体并清除它们
| 归档时间: |
|
| 查看次数: |
150473 次 |
| 最近记录: |