【问题标题】:Using an existing database in an iMessage app (Swift)在 iMessage 应用程序中使用现有数据库 (Swift)
【发布时间】:2017-07-29 10:31:59
【问题描述】:

目前正在构建一个 iMessage 应用程序,并想尝试使用数据库。我有一个我想在应用程序中使用的数据库,并将其包含在我的项目中,并验证了目标成员资格是否正确。使用 SQLite.Swift。

每当我尝试在模拟器中打开与数据库的连接时,我总是会收到数据库路径的错误(意外为零)。

我以同样的方式尝试了图像文件,但无济于事。

 let imagePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")

    do {
        let db = try Connection(imagePath!, readonly: true)

    } catch {

    }

【问题讨论】:

  • 我使用照片扩展程序,如果我没看错的话,“iMessage 应用程序”实际上更像是消息 扩展程序,而不是实际的 应用程序。我创建了一个并且“开箱即用”我看到两个目标并且没有主视图控制器。基于此(以及我对照片扩展的经验),我认为问题出在Bundle.main - 没有。我使用了一个框架目标,is 有一种方法可以包含图像和脚本并在其中找到“捆绑包”的位置。如果您愿意,我可以发布该代码作为答案。 (编辑:我不知道这是否适用于数据库,但它应该。)
  • @dfd 我愿意尝试任何事情。感谢您的帮助。

标签: ios swift xcode sqlite imessage


【解决方案1】:

我认为这个问题与 iMessage "app" 的含义更相关——它实际上是一个扩展,而不是一个真正的应用程序。没有初始 VC,因此没有真正的Bundle.main 可以访问。

我的一个(可能很快第二个)应用程序有一个照片编辑扩展程序 - 基本上就是我一直所说的与 Apple 应用程序的“外壳连接”。你要么真的有一个“什么都不做”的应用程序连接到他们的一个应用程序,要么你有一个独立的应用程序共享代码与扩展。

我共享代码的解决方案是使用框架目标。是的,第三个​​项目。 (应用程序、扩展程序、共享代码。)我发现了一种我认为应该适合您的技术 - 基本上,对于图像、脚本(我的应用程序使用 .cikernel 文件),您将它们添加到框架项目中,然后在函数调用中返回您需要的内容。

您可以根据需要框架目标来简化此操作。 YMMV。基本情况是这样的:

  • 在 Xcode 中的某个地方有一个“Bundle Identifier”。类似于 *"com.company.projectname"。
  • 将您的文件放入一个文件夹中,也许在您的桌面上。向此文件夹添加一个名为 ".bundle" 的扩展名。 macOS 会给你一个警告,接受它。您真正要做的就是创建捆绑包。
  • 将其拖到您的 Xcode 项目中。
  • 获取此捆绑包的代码以及其中的文件。 (我不确定这里是否需要一个框架 - 尝试先将它拖到您的“MessagesExtension”目标中。

假设您有希望在项目、扩展程序等之间共享的图像。将它们移动到一个名为“images”的文件夹中,并在最后用“.bundle”重命名该文件夹,最后将其拖到您的 Xcode 项目中,您几乎需要添加此功能:

public func returnImage(_ named:String) -> UIImage {
    let myBundle = Bundle.init(identifier: "com.company.project")
    let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named
    let theImage = UIImage(contentsOfFile: imagePath)
    return theImage!
}

对于你想要的文本文件:

public func returnKernel(_ named:String) -> String {
    let myBundle = Bundle.init(identifier: "com.company.project")
    let kernelPath = (myBundle?.path(forResource: "cikernels", ofType: "bundle"))! + "/" + named + ".cikernel"
    do {
        return try String(contentsOfFile: kernelPath)
    }
    catch let error as NSError {
        return error.description
    }
}

用法,用于名为“Camera.png”的图像,该图像是名为“images.bundle”的捆绑包的一部分:

let cameraImage = returnImage("Camera")

由于我不使用 SQLite 文件,我没有确切的代码,但我认为这应该可以。请记住将“com.company.project”更改为您拥有的捆绑标识符。

【讨论】:

  • 非常有指导意义!谢谢!今晚晚些时候我会试试看。当我得到一些工作时,我会更新。
  • 抱歉,我还是 Swift 新手。在函数中,您是否将字符串传递给函数? -- 没关系,我有时只是有点慢,哈哈
  • 我继续在我的实际项目中尝试了图像功能,然后在新项目中尝试了第二次。我试过两次都崩溃了。我可以尝试将其用作框架吗?图片:imgur.com/ub2xpMBimgur.com/y3E91z7
  • 有几件事:(1) 在您的 .xcodeproj 常规属性中,您的包 ID 是“zb.test”吗? (2) 图片 "pic" 是 ".png" 还是 ".jpg" - 如果是后者,您需要添加文件的扩展名。 (3) 图像是否在“.bundle”中?看来您可能需要尝试一个框架。
  • 我成功了!我有两个问题:我没有完全检查捆绑 ID 是否有效(我相信它说明了它不够独特),所以我改变了它。另一个是将“.MessagesExtension”添加到函数标识符的末尾。一旦我改变了这些东西,你的文本文件功能就可以很好地工作,甚至可以找到我的数据库文件。谢谢!
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2017-01-18
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
相关资源
最近更新 更多