Today Extension 删除 sqlite 中的数据
Posted
技术标签:
【中文标题】Today Extension 删除 sqlite 中的数据【英文标题】:Today Extension deleting data in sqlite 【发布时间】:2015-06-04 10:51:10 【问题描述】:我在现有应用中添加了 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
【问题讨论】:
您的storeurl
似乎不正确,请确保它使用分组文件夹。您的函数 applicationDocumentsDirectory
应该返回 groupPath,在您的情况下,应用程序似乎正在创建一个新的 CoreData,而不是使用正确的。
我正在使用共享组标识符来设置核心数据。只有当我今天尝试打开(获取数据)并且主应用程序没有被杀死时,数据才会删除。如果主应用程序被杀死,今天可以正常工作并且没有数据被删除。
为什么将journal_mode
设置为MEMORY
? SQLite 文档说这个"...saves disk I/O but at the expense of database safety and integrity."
我实现了pablin.org/2013/05/24/…中提到的解决方案。问题仍然存在,但我的数据没有。
那篇博文没有说明将日记模式设置为MEMORY
。
【参考方案1】:
经过大量调试并阅读谷歌搜索的博客和文档后,我认为问题出在 mergedModelFromBundles
的 NSManagedObjectModel
方法上。
我的包中有多个 .xcdatamodels,在设置核心数据堆栈期间,我使用上述方法合并单个模型。
由于为 Today 设置的核心数据堆栈,从该方法返回的模型与 Main 应用程序用于创建 sqlite 存储的模型不同,因此返回的持久存储不同,需要迁移。
但迁移往往失败并删除我的 .sqlite(由主应用程序设置)并设置新的 sqlite。
我发现的一种解决方案是使用NSManagedObjectModel(contentsOfURL: modelPathURL!)
获取托管对象模型的方法,其中url是bundle中momd文件的路径url。
参考:Core Data Migration Guide
但是,我还没有想到,如何将三个不同 xcdatamodelid 的路径 url 作为单个路径 url 以及如果将来任何 xcdatamodel 发生更改,如何迁移它们。 所以,目前我已经将三个 xcdatamodel 合并到我的 bundle 中的单个 xcdatamodel 中来解决这个问题。
【讨论】:
以上是关于Today Extension 删除 sqlite 中的数据的主要内容,如果未能解决你的问题,请参考以下文章
Today Extension Widget 使用 TableView