我如何从Core Data的持久存储中删除所有对象?

13 浏览
0 Comments

我如何从Core Data的持久存储中删除所有对象?

我在我的应用程序中使用了核心数据。因此,我获取一个XML文件,将数据解析成模型对象并将其插入到核心数据中。它们保存在持久存储中,我可以在重新启动应用程序时访问它们。然而,我希望能够随时刷新持久存储中的数据,因此需要首先从存储中删除现有对象。是否有一种简单直接的方法可以做到这一点?

谢谢


我找到了以下解决方案:

[managedObjectContext lock];
[managedObjectContext reset];//放弃未决的更改
if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error])
{
NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]];
[[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil];
[self addPersistentStore];//重新创建持久存储
}
[managedObjectContext unlock];

0
0 Comments

问题的出现原因:用户想要从Core Data的持久化存储中删除所有对象。

解决方法:根据Manzini的回答,用户可以使用以下Swift 2.1版本的代码来实现删除功能。代码中使用了一个扩展NSManagedObjectContext,其中包含了一个deleteAllData()方法。该方法首先获取持久化存储的URL,然后通过调用reset()方法重置上下文,接着尝试删除持久化存储并删除文件,最后重新添加持久化存储。

整个解决方法的代码如下:

import Foundation

import CoreData

extension NSManagedObjectContext

{

func deleteAllData()

{

guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else {

return

}

guard let url = persistentStoreCoordinator?.URLForPersistentStore(persistentStore) else {

return

}

performBlockAndWait { () -> Void in

self.reset()

do

{

try self.persistentStoreCoordinator?.removePersistentStore(persistentStore)

try NSFileManager.defaultManager().removeItemAtURL(url)

try self.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)

}

catch { /*处理错误*/ }

}

}

}

以上是问题的原因和解决方法。

0
0 Comments

问题的原因是需要从Core Data的持久化存储中删除所有对象。解决方法是使用Swift编写的代码来执行此操作。

解决方法的代码如下:

if let psc = self.managedObjectContext?.persistentStoreCoordinator{

if let store = psc.persistentStores.last as? NSPersistentStore{

let storeUrl = psc.URLForPersistentStore(store)

self.managedObjectContext?.performBlockAndWait(){

self.managedObjectContext?.reset()

var error:NSError?

if psc.removePersistentStore(store, error: &error){

NSFileManager.defaultManager().removeItemAtURL(storeUrl, error: &error)

psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: nil, error: &error)

}

}

}

}

以上是问题的解决方法,使用Swift语言编写的代码可以删除Core Data持久化存储中的所有对象。

0
0 Comments

如何从Core Data中删除所有对象?

问题原因:用户想要清空Core Data中的所有对象。

解决方法:以下是一个可以完全清空Core Data的方法。这个方法适用于只有一个持久存储的情况,如果没有手动添加其他存储的话。如果managedObjectContext的名称与这里的相同,可以直接复制粘贴使用。

NSError * error;
// 检索存储URL
NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// 锁定当前上下文
[managedObjectContext lock];
[managedObjectContext reset];//放弃未决更改
// 从当前managedObjectContext中删除存储
if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{
    // 删除包含数据的文件
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    // 像appDelegate方法一样重新创建存储
    [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//重新创建持久存储
}
[managedObjectContext unlock];
// 完成!

感谢,非常好!一个问题:如何在ARC下使用'NSError ** error'?它会报错:'Pointer to non-const type "NSError **" with no explicit ownership'。

是的,你必须像这样声明它 _SomethingIDontRemeber NSError ** error,或者如果你不想要错误,可以直接传递nil,这样更容易一些... 😉

或者只需将第一行更改为'NSError *error',然后在之后的引用中使用'&error'。

你的代码对我来说不起作用,看看这个吧stackoverflow.com/questions/14646595/…

谢谢,这正是我需要的。在这个答案中,他们还提到,截至iOS 5,如果存在外部二进制存储,我们仍然需要删除它。stackoverflow.com/a/1222145/1672161

嗨,请你看一下我的问题stackoverflow.com/questions/19358095

完美无缺地运行!:)

请注意,lock方法已被弃用。解决方案应该使用performBlockAndWait方法:

0