【问题标题】:Share sqlite db into share extension into iPhone app将 sqlite db 共享到 iPhone 应用程序的共享扩展中
【发布时间】:2017-07-22 07:01:34
【问题描述】:

我想将共享扩展程序集成到我的 iPhone 应用程序中。应用程序包含 sqlite 数据库,其中包含一些电话簿联系人。我在应用程序中添加了共享扩展,并且扩展在共享活动视图控制器中也是可见的。但问题是我无法访问主应用程序 sqlite 数据库。当我在扩展中记录数据库路径时,它显示的路径与主应用程序 sqlite 数据库路径不同。所以请帮助我了解如何访问主应用程序数据库以从 sqlite 获取数据,以便我可以将它们显示到共享扩展自定义视图控制器中,并希望将新数据插入数据库。

【问题讨论】:

  • hii @Vyas Kishan,我也遇到了同样的问题..你有什么解决办法吗?
  • @V12,我找到了替代解决方案。为此使用应用程序组。当用户打开共享扩展和用户打开主应用程序从应用程序组检索信息并存储到 sqlite db 时,将所有信息存储到其中。这是唯一的解决方案。
  • 得到了解决方案 :) 我会把我遵循的步骤发给你。

标签: ios ios8-share-extension


【解决方案1】:

在主应用和共享扩展之间共享 UserDefault 和 Sqlite:

在功能中添加“应用组”,以便将主应用中的数据传输到扩展

  • 分享NSUserDefaults 数据: [NSUserDefaults standardUserDefaults]替换为[[NSUserDefaults alloc] initWithSuiteName:@"group.com.XXX.XXX"];

  • 如果您在文档目录中复制了 sqlite 文件。因此,从

    更改文档目录路径

    try! FileManager.default.url(for:.documentDirectory, in:.userDomainMask,appropriateFor: nil, create:false).appendingPathComponent(fileName)

let fileManager = FileManager.default 
let directory = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.xxx.xxx")
return directory!.appendingPathComponent(fileName).path
  • 选择Target Members(主项目和 所需课程的扩展)
  • 如果您需要在扩展中导入任何 pod,请编辑 pod 文件
    target 'Main_App' do
    # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
    use_frameworks!
    
    target 'Main_App_extension' do
     use_frameworks! 
      inherit! :search_paths
      pod 'FMDB’
      pod 'Kingfisher'
    
    end
    end

【讨论】:

    【解决方案2】:

    首先你需要找到数据库路径为:

      func checkPath()->String {
            let dbPath = ""
           let filemgr = FileManager.default
        let dirPaths =
            NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                                .userDomainMask, true)
    
        let docsDir = dirPaths[0]
    
        let databasePath = docsDir.appending("/dbName.sqlite") as NSString
    
        if !filemgr.fileExists(atPath: databasePath as String) {
    
    
            dbPath = databasePath
    
        }
       return dbPath
       }
    

    获取路径后,您现在可以访问共享数据库文件:

       let ShareableDb = NSData(contentsOfFile: checkPath())
    

    这就是您共享 db 文件所需的全部内容。希望对你有所帮助。

    【讨论】:

    • 我得到了应用程序组和主应用程序的不同路径。 -- 来自主应用程序的数据库路径 /Users/dnk/Library/Developer/CoreSimulator/Devices/3AEA77CB-EDC4-4484-9FA4-BAA92B98D277/data/Containers/Data/Application/9B9A59C1-74A4-4BF8-9E99-40A4660E0ED4/Documents/ DB.sqlite -- 来自应用程序组的数据库路径 /Users/dnk/Library/Developer/CoreSimulator/Devices/3AEA77CB-EDC4-4484-9FA4-BAA92B98D277/data/Containers/Data/PluginKitPlugin/202A137C-D65B-4ECD-9BE2-5FC15135ABA4 /Documents/DB.sqlite
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多