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】:

经过大量调试并阅读谷歌搜索的博客和文档后,我认为问题出在 mergedModelFromBundlesNSManagedObjectModel 方法上。 我的包中有多个 .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

iOS扩展Extension之Today

App Today Extension开发注意事项

iOS 8 Today Extension:是否可以添加可编辑的文本字段?

Today Extension 上的 CocoaPods

添加 Today Extension 编译失败