目前正在构建iMessage应用,并希望尝试使用数据库。我有一个数据库,我想在应用程序中使用,并将其包含在我的项目中,并验证目标成员资格是否正确。使用SQLite.Swift。
每当我尝试在模拟器中打开与数据库的连接时,我总是会收到数据库路径的错误(意外为零)。
我尝试过同样的图像文件但没有用。
let imagePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")
do {
let db = try Connection(imagePath!, readonly: true)
} catch {
}
答案 0 :(得分:1)
我认为这个问题与iMessage “app”的关系更为相关 - 这实际上是一个扩展,而不是真正的应用。没有初始VC,因此没有真正的Bundle.main
。
我的一个(可能很快就是一秒钟)应用程序有一个照片编辑扩展 - 基本上我一直称之为Apple应用程序的“shell连接”。你真的有一个“无所事事”的应用程序与他们的一个应用程序的连接,或者你有一个独立的应用程序分享与扩展名的代码。
我的共享代码解决方案是使用Framework目标。是的,第三个项目。 (应用程序,扩展,共享代码。)我发现了一种技术,我认为应该适合您 - 基本上,对于图像,脚本(我的应用程序使用 .cikernel 文件),您将它们添加到框架项目中在函数调用中返回所需内容。
您可以通过对Framework目标的需求来简化此操作。因人而异。基础是:
因此,假设您希望在项目,扩展程序之间共享图像。将它们移动到一个名为“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”更改为您对包标识符的内容。