con*_*fin 16 iphone cocoa-touch core-data ios
我的核心数据在我的应用中运行.因此,我获取XML文件,将数据解析为模型对象并将其插入到核心数据中.它们保存在持久性存储中,我可以在重新启动应用程序时访问它们.但是,我希望能够随意刷新持久存储中的数据,因此我需要先从存储中删除现有对象.对此有直接的方法吗?
谢谢
我找到了这个解决方案
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error])
{
NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]];
[[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil];
[self addPersistentStore];//recreates the persistent store
}
[managedObjectContext unlock];
Run Code Online (Sandbox Code Playgroud)
Nic*_*ini 62
这就是我完全清理核心数据所做的工作.它完美地运作.如果您只有一个持久性存储,如果您没有手动添加一个,则可能就是这种情况.如果您的managedObjectContext与此处的名称相同,则只需复制/过去即可.
NSError * error;
// retrieve the store URL
NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{
// remove the file containing the data
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
//recreate the store like in the appDelegate method
[[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store
}
[managedObjectContext unlock];
//that's it !
Run Code Online (Sandbox Code Playgroud)
快速版的@Nicolas Manzini回答:
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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据@Nicolas Manzini的回答,我写了一个Swift 2.1版本,几乎没有什么改进.我添加了一个扩展名NSManagedObjectContext.完整代码如下:
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 { /*dealing with errors up to the usage*/ }
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15664 次 |
| 最近记录: |