繁体   English   中英

数据库中存在数据库但不存在于设备构建中(将文件从App Bundle复制到Swift中的文档目录)

[英]Database present in simulator but not on device build (Copying files from App Bundle to Documents Directory in Swift)

我有一个问题,我无法找到答案。

我有一个具有sqlite数据库的应用程序(称为“myDatabase.sqlite”)。 为了让它在模拟器构建中工作,我通过使用以下代码找到了它的路径:

        let fileManager = NSFileManager.defaultManager()
    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

    let docsDir = dirPaths[0] as! String

    databasePath = docsDir.stringByAppendingPathComponent("myDatabase.sqlite")

    let database = FMDatabase(path: databasePath as String)

这在模拟器中有效,但我不得不将文件放在该路径中。

对于设备上的测试,我希望这与包一起转移。 我将相同的数据库复制到应用程序包中(oops,我没有足够的声誉来发布图像,但它位于应用程序包中文件列表中的一个视图控制器下面)。

但是,当我在设备上运行构建时,我从控制台获得以下读数:

在/var/mobile/Containers/Data/Application/64ECF088-1AA8-4B9F-AF65-4E36EF10AF9C/Documents/myDatabase.sqlite打开数据库2015-04-20 11:39:15.991 TestApp [15882:2776428] DB错误:1“没有这样的表:卡“2015-04-20 11:39:15.992 TestApp [15882:2776428] DB查询:SELECT * FROM卡2015-04-20 11:39:15.992 TestApp [15882:2776428] DB路径:/ var /mobile/Containers/Data/Application/64ECF088-1AA8-4B9F-AF65-4E36EF10AF9C/Documents/myDatabase.sqlite错误:没有这样的表:卡片

有谁知道我做错了什么?

谢谢。

所以我最终解决了这个问题,但是因为我没有在Swift的任何地方看到这个,所以我会发布任何人的未来用途:

有一个类属性:

var databasePath = NSString()

然后:(我把调试控制台输出作为注释留下)

func createOrReturnDatabase() -> FMDatabase {

    let fileManager = NSFileManager.defaultManager()
    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

    let docsDir = dirPaths[0] as! String

    let pathForDB = NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("myNewDatabase.sqlite")

    databasePath = docsDir.stringByAppendingPathComponent("myNewDatabase.sqlite")

    if !fileManager.fileExistsAtPath(databasePath as String) {
        println("Database not present, so we created one from \(pathForDB)")
        fileManager.copyItemAtPath(pathForDB, toPath: databasePath as String, error: nil)
        println("Copied database to \(databasePath), and a file exists there is: \(fileManager.fileExistsAtPath(databasePath as String))")
        return FMDatabase(path: databasePath as String)
    } else {
        println("I returned the database because it exists.")
        return FMDatabase(path: databasePath as String)
    }

}

您应该在应用程序启动时检查您的数据库是否在正确的位置。 如果不是,请从您的捆绑包中复制它。 正如@rmaddy所说,文档文件夹与应用程序包不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM