是否可以在app扩展程序中从应用程序的本地数据库加载数据?

时间:2018-02-16 10:36:49

标签: ios swift ios-app-extension

是否可以在应用扩展程序中从应用的本地数据库加载数据?

我有一个要求在app扩展程序中使用应用程序的本地数据库。

有可能吗?如果是,那就给出一些消息来源。

3 个答案:

答案 0 :(得分:0)

您可以在主应用程序和扩展程序之间共享数据的唯一方法是使用带有suiteName的userDefaults使用应用程序组,因此如果您可以将所有数据从数据库写入默认值,那么它将被共享,但是问题是它不是推荐的方式,因为默认情况下保存配置数据,也必须首先启动扩展,以便应用程序可以从中读取数据

答案 1 :(得分:0)

您必须使用应用程序组标识符,您可以与NSUserDefaults共享数据。 https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

您可以使用相同的应用程序组标识符来访问共享目录:

NSURL *groupURL = [[NSFileManager defaultManager]
    containerURLForSecurityApplicationGroupIdentifier:
        @"com.yourapp.domain"];

扩展程序可以使用网络获取数据。

答案 2 :(得分:0)

您可以在主机应用及其应用扩展程序之间共享所有内容:

  • 通过钥匙串共享的钥匙串
  • 通过应用程序组的UserDefaults
  • 通过应用程序组的文件
  • 通过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 })

请注意,如果主机应用和扩展程序同时运行并且同时写入数据库,则必须自己处理锁定。