是否可以在应用扩展中从应用的本地数据库加载数据?
Posted
技术标签:
【中文标题】是否可以在应用扩展中从应用的本地数据库加载数据?【英文标题】:Is it possible to load data from app's local database in app extension? 【发布时间】:2018-02-16 10:36:49 【问题描述】:
我有一个要求是在应用扩展中使用应用的本地数据库。
有可能吗?如果是,请提供一些来源。
【问题讨论】:
看看这个文件:developer.apple.com/library/content/documentation/General/… 【参考方案1】:您可以在主应用程序和扩展程序之间共享数据的唯一方法是通过 userDefaults 和 suiteName 使用应用程序组,因此如果您可以将数据库中的所有数据写入默认值,那么它将被共享,但问题是这不是推荐的方式,因为默认情况下始终保存配置数据,还必须先启动扩展程序,以便应用程序可以从中读取数据
【讨论】:
扩展中可以调用webservice吗?【参考方案2】:您必须使用应用程序组标识符,您可以与NSUserDefaults
共享数据。 https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
您可以使用相同的应用程序组标识符来访问共享目录:
NSURL *groupURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:
@"com.yourapp.domain"];
扩展可以使用网络来获取数据。
【讨论】:
这意味着我可以在应用扩展中使用容器应用的资源文件(.txt 或 .json)? 是的,这篇博文详细讲解:atomicbird.com/blog/sharing-with-app-extensions 哦。非常感谢你的分享。 你有演示吗?【参考方案3】:您可以在主机应用及其应用扩展之间共享所有内容:
钥匙串通过钥匙串共享 通过应用组的用户默认值 通过应用组的文件 通过 SQLite 文件和应用组的数据库要在主机应用程序和扩展程序之间共享数据库,您只需将数据库文件放入应用程序组的共享存储中。这样,主机应用程序数据库中的任何更改都可以立即在扩展程序的数据库中使用,反之亦然。使用CoreStore 框架,在应用组存储中设置数据库非常容易:
import CoreStore
let dataStack: DataStack =
let dataStack = DataStack(xcodeModelName: "App")
let storagePathUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.company.App")!.appendingPathComponent("App.sqlite")
do
try dataStack.addStorageAndWait(SQLiteStore(fileURL: storagePathUrl, configuration: "Default", localStorageOptions: .
recreateStoreOnModelMismatch))
catch let error
print("Cannot set up database storage: \(error)")
return dataStack
()
将用户对象(用户必须在 App.xcdatamodeld 中定义)插入数据库的示例如下:
dataStack.perform(asynchronous: transaction in
let user = transaction.create(Into<User>())
user.email = "user@test.com"
user.name = "test"
, completion: _ in )
请注意,如果宿主应用程序和扩展程序同时运行并同时写入数据库,您必须自己处理锁定。
【讨论】:
以上是关于是否可以在应用扩展中从应用的本地数据库加载数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 phonegap 应用程序中从网页导航到本地页面?
是否可以在基于对话框的应用程序中从 CWinThread 类派生类