Swift – 设备上未包含预先填充的SQLite数据库

Swift – 设备上未包含预先填充的SQLite数据库,第1张

概述我试图将一个预先填充的SQLite数据库(带有FMDB包装器)包含在我的物理iPhone的构建中.但是,预先填充的数据库未包含在物理设备的构建中. 请注意,它在IOS模拟器中工作正常,但仅适用于一个模拟器设备. 我已将数据库包含在Build Phases>中复制捆绑资源并将Link Binary下的libsqlite3.dylib与Libraries联系起来. 我需要添加什么Swift代码才能将构 我试图将一个预先填充的sqlite数据库(带有FMDB包装器)包含在我的物理iPhone的构建中.但是,预先填充的数据库未包含在物理设备的构建中.

请注意,它在IOS模拟器中工作正常,但仅适用于一个模拟器设备.

我已将数据库包含在Build Phases>中复制捆绑资源并将link Binary下的libsqlite3.dylib与librarIEs联系起来.

我需要添加什么Swift代码才能将构建中包含的数据库添加到物理设备中?

码:

import UIKitclass VIEwController: UIVIEwController {    @IBOutlet weak var checkbutton: UIbutton!    @IBOutlet weak var tests_scroller: UITextVIEw!    var databasePath = Nsstring()    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        checkbutton.setTitle("\u{2610}",forState: .normal)        checkbutton.setTitle("\u{2611}",forState: .Selected)        let filemgr = NSfileManager.defaultManager()        let dirPaths = NSSearchPathForDirectorIEsInDomains(.documentDirectory,.UserDomainMask,true)        let docsDir = dirPaths[0] as! String        databasePath = docsDir.stringByAppendingPathComponent("vmd_db.db")        let myDatabase = FMDatabase(path: databasePath as String)        if myDatabase.open(){            var arrayData:[String] = []            let query_lab_test = "SELECT lab_test FROM lab_test ORDER BY lab_test ASC"            let results_lab_test:FMResultSet? = myDatabase.executequery(query_lab_test,withArgumentsInArray: nil)            while results_lab_test?.next() == true {                if let resultString = results_lab_test?.stringForColumn("lab_test"){                arrayData.append(resultString)            }        }            var multilinestring = join("\n",arrayData)            tests_scroller.text = multilinestring            myDatabase.close()    }    }    overrIDe func dIDReceiveMemoryWarning() {        super.dIDReceiveMemoryWarning()        // dispose of any resources that can be recreated.    }}

更新 – 在XCode 7中使用Swift 2代码 – 使用FMDB包装器预先填充的sqlite数据库复制到物理设备OK:

import UIKitclass VIEwController: UIVIEwController {    @IBOutlet weak var tests_scroller: UITextVIEw!    var databasePath = Nsstring()    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        let sourcePath = NSBundle.mainBundle().pathForResource("vmd_db",ofType: "db")        let documentDirectoryPath = NSSearchPathForDirectorIEsInDomains(.documentDirectory,true).first as String!        let destinationPath = (documentDirectoryPath as Nsstring).stringByAppendingPathComponent("vmd_db.db")        do {                                            try NSfileManager().copyItemAtPath(sourcePath!,topath: destinationPath)        } catch _ {                        }        //read it        let myDatabase = FMDatabase(path: destinationPath as String)        if myDatabase.open(){            var arrayData:[String] = []            let query_lab_test = "SELECT lab_test FROM lab_test ORDER BY lab_test ASC"            let results_lab_test:FMResultSet? = myDatabase.executequery(query_lab_test,withArgumentsInArray: nil)            while results_lab_test?.next() == true {                if let resultString = results_lab_test?.stringForColumn("lab_test"){                    arrayData.append(resultString)                }            }            let multilinestring = arrayData.joinWithSeparator("\n")            tests_scroller.text = multilinestring            myDatabase.close()        }    }    overrIDe func dIDReceiveMemoryWarning() {        super.dIDReceiveMemoryWarning()        // dispose of any resources that can be recreated.    }}
解决方法 从我看到它不应该在任何模拟器/设备上工作,因为您访问文档文件夹中的文件.那不在你的包中.

您需要做的是将文件从包中复制到文档目录,然后尝试在那里打开它:

//path in documentslet dirPaths = NSSearchPathForDirectorIEsInDomains(.documentDirectory,true)let docsDir = dirPaths[0]databasePath = docsDir.stringByAppendingPathComponent("vmd_db.db")//if not there,copy from bundleif !filemgr.fileExistsAtPath(databasePath) {    let bundleDatabasePath = NSBundle.mainBundle().pathForResource("vm_db",ofType: "db")    filemgr.copyItemAtPath(bundleDatabasePath,topath: databasePath)}//read itlet myDatabase = FMDatabase(path: databasePath as String)
总结

以上是内存溢出为你收集整理的Swift – 设备上未包含预先填充的SQLite数据库全部内容,希望文章能够帮你解决Swift – 设备上未包含预先填充的SQLite数据库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1017786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存