请注意,它在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数据库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)