今天扩展删除 sqlite 中的数据
Today Extension deleting data in sqlite
我在我现有的应用程序中添加了 Today Extension 并设置了一个单独的核心数据堆栈(重复使用用于为主应用程序设置核心数据的相同代码)。
当我 运行 Today 扩展时,我的应用程序数据被删除,就好像 Today 核心数据堆栈的设置删除了现有数据一样。参考下面的代码返回 persistentCoordinator
:
let options = [NSMigratePersistentStoresAutomaticallyOption:true,
NSInferMappingModelAutomaticallyOption:true,
NSSQLitePragmasOption:["journal_mode":"MEMORY"]]
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil {
NSLog("Unresolved error \(error)")
}
return coordinator
经过大量调试并阅读了谷歌搜索的博客和文档,我认为问题出在 NSManagedObjectModel
的 mergedModelFromBundles
方法。
我的包中有多个 .xcdatamodels,在设置核心数据堆栈期间,我使用上述方法合并单个模型。
由于为 Today 设置了核心数据堆栈,从该方法返回的模型与 Main app 用于创建 sqlite 存储的模型不同,因此返回的持久存储不同,需要迁移。
但是迁移经常失败并删除我的 .sqlite(由主应用程序设置)并设置一个新的 sqlite。
我找到的一种解决方案是使用
NSManagedObjectModel(contentsOfURL: modelPathURL!)
获取托管对象模型的方法,其中url是bundle中momd文件的路径url。
参考:Core Data Migration Guide
但是,我还没有想到,如何将三个不同 xcdatamodelid 的路径 url 作为单一路径 url 以及如果将来任何 xcdatamodel 发生变化时如何迁移它们。
所以,目前我已经将三个 xcdatamodels 合并到我的包中的单个 xcdatamodel 来解决这个问题。
我在我现有的应用程序中添加了 Today Extension 并设置了一个单独的核心数据堆栈(重复使用用于为主应用程序设置核心数据的相同代码)。
当我 运行 Today 扩展时,我的应用程序数据被删除,就好像 Today 核心数据堆栈的设置删除了现有数据一样。参考下面的代码返回 persistentCoordinator
:
let options = [NSMigratePersistentStoresAutomaticallyOption:true,
NSInferMappingModelAutomaticallyOption:true,
NSSQLitePragmasOption:["journal_mode":"MEMORY"]]
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil {
NSLog("Unresolved error \(error)")
}
return coordinator
经过大量调试并阅读了谷歌搜索的博客和文档,我认为问题出在 NSManagedObjectModel
的 mergedModelFromBundles
方法。
我的包中有多个 .xcdatamodels,在设置核心数据堆栈期间,我使用上述方法合并单个模型。
由于为 Today 设置了核心数据堆栈,从该方法返回的模型与 Main app 用于创建 sqlite 存储的模型不同,因此返回的持久存储不同,需要迁移。
但是迁移经常失败并删除我的 .sqlite(由主应用程序设置)并设置一个新的 sqlite。
我找到的一种解决方案是使用
NSManagedObjectModel(contentsOfURL: modelPathURL!)
获取托管对象模型的方法,其中url是bundle中momd文件的路径url。
参考:Core Data Migration Guide
但是,我还没有想到,如何将三个不同 xcdatamodelid 的路径 url 作为单一路径 url 以及如果将来任何 xcdatamodel 发生变化时如何迁移它们。
所以,目前我已经将三个 xcdatamodels 合并到我的包中的单个 xcdatamodel 来解决这个问题。