sqlite – 如何在swift中捆绑预先填充的数据库

sqlite – 如何在swift中捆绑预先填充的数据库,第1张

概述我知道有很多相关的帖子,但我注意到他们都没有解释这样做的方式,大多数人说要查看文档,我看起来已经看了但似乎缺乏有关将预先填充数据库带到 Swift的信息 我有一个旧的数据库.db,超过60k行三列,我想用FMDB包装器带到我的swift SQLite应用程序,该应用程序在iPhone中工作,我试图将contacts.db拖到应用程序但我无法访问它.在设备中运行时,应用程序始终启动新数据库. 我将 我知道有很多相关的帖子,但我注意到他们都没有解释这样做的方式,大多数人说要查看文档,我看起来已经看了但似乎缺乏有关将预先填充的数据库带到 Swift的信息

我有一个旧的数据库.db,超过60k行三列,我想用FMDB包装器带到我的swift sqlite应用程序,该应用程序在iPhone中工作,我试图将contacts.db拖到应用程序但我无法访问它.在设备中运行时,应用程序始终启动新数据库.

我将数据库复制到支持文件文件夹,并尝试在app文件夹中,无法访问

有没有人这样做并愿意告诉我该怎么做?

总之,我正在寻找的是将我的contacts.db插入应用程序(包),以便我可以访问设备而不是在模拟器中.我不需要在设备中添加删除或编辑contact.db,数据库加载了所需的所有信息,用户只能进行搜索并能够显示结果.

class VIEwController: UIVIEwController {@IBOutlet weak var name: UITextFIEld!@IBOutlet weak var address: UITextFIEld!var databasePath = Nsstring()    overrIDe func vIEwDIDLoad() {    super.vIEwDIDLoad()    if let resourceUrl = NSBundle.mainBundle().URLForResource("contacts",withExtension: "db") {        if NSfileManager.defaultManager().fileExistsAtPath(resourceUrl.path!)     }    let filemgr = NSfileManager.defaultManager()    let dirPaths =    NSSearchPathForDirectorIEsInDomains(.documentDirectory,.UserDomainMask,true)    let docsDir = dirPaths[0] as! String    databasePath = docsDir.stringByAppendingPathComponent(                    "contacts.db")    if !filemgr.fileExistsAtPath(databasePath as String) {        let contactDB = FMDatabase(path: databasePath as String)        if contactDB == nil {            println("Error: \(contactDB.lastErrorMessage())")        }        if contactDB.open() {            let sql_stmt = "CREATE table IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,ADDRESS TEXT,PHONE TEXT)"            if !contactDB.executeStatements(sql_stmt) {                println("Error: \(contactDB.lastErrorMessage())")            }            contactDB.close()        } else {            println("Error: \(contactDB.lastErrorMessage())")        }    }}
Swift 2示例

一些假设:

>您已正确地将libsqlite3.tbd添加到项目中.
>您已正确地向项目添加了sqlite数据库.
>您已将所需的FMDB文件正确复制到项目中.
>你有一个名为VIEwController.swift的VIEwController

在Xcode中打开VIEwController.swift文件并找到以下代码:

overrIDe func vIEwDIDLoad() {     super.vIEwDIDLoad()     // Do any additional setup after loading the vIEw,typically from a nib.

在评论下方添加以下代码,请记住在第4行和第4行中更改数据库的名称. 5.

// Start of Database copy from Bundle to App document Directory     let fileManager = NSfileManager.defaultManager()     let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectorIEsInDomains(.documentDirectory,true)[0])     let destinationsqliteURL = documentsPath.URLByAppendingPathComponent("sqlite.db")     let sourcesqliteURL = NSBundle.mainBundle().URLForResource("sqlite",withExtension: "db")     if !fileManager.fileExistsAtPath(destinationsqliteURL.path!) {         // var error:NSError? = nil         do {             try fileManager.copyItemAtURL(sourcesqliteURL!,toURL: destinationsqliteURL)             print("copIEd")             print(destinationsqliteURL.path)         } catch let error as NSError {             print("Unable to create database \(error.deBUGDescription)")         }     }     // Let's print the path to the database on your Mac     // so you can go look for the database in the Finder.     print(documentsPath)     let db = FMDatabase(path: destinationsqliteURL.path)    // Let's open the database    if !db.open() {        print("Unable to open database")        return    }    // Let's run some sql from the FMDB documents to make sure    // everything is working as expected.      if !db.executeUpdate("create table test(x text,y text,z text)",withArgumentsInArray: nil) {        print("create table Failed: \(db.lastErrorMessage())")    }    if !db.executeUpdate("insert into test (x,y,z) values (?,?,?)",withArgumentsInArray: ["a","b","c"]) {        print("insert 1 table Failed: \(db.lastErrorMessage())")    }    if !db.executeUpdate("insert into test (x,withArgumentsInArray: ["e","f","g"]) {        print("insert 2 table Failed: \(db.lastErrorMessage())")    }    if let rs = db.executequery("select x,z from test",withArgumentsInArray: nil) {        while rs.next() {            let x = rs.stringForColumn("x")            let y = rs.stringForColumn("y")            let z = rs.stringForColumn("z")            print("x = \(x); y = \(y); z = \(z)")        }    } else {        print("select Failed: \(db.lastErrorMessage())")    }    db.close()

您应该能够立即运行项目并复制数据库.

以前的答案,如果它有助于某人

documentation for FMDB对此主题非常有帮助.使用那里的示例,下面的代码应该假设以下事项:

>您正在使用Swift 1.2或更高版本.
>您已将FMDB正确添加到项目中.
>一个名为contacts.db的sqlite数据库已正确添加到项目中.
>在构建阶段,然后链接二进制文件库,您已添加libsqlite3.dylib.

////  VIEwController.swift//import UIKitclass VIEwController: UIVIEwController {    @IBOutlet weak var name: UITextFIEld!    @IBOutlet weak var address: UITextFIEld!    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        // Do any additional setup after loading the vIEw,typically from a nib.        let filemgr = NSfileManager.defaultManager()        let documentsFolder = NSSearchPathForDirectorIEsInDomains(.documentDirectory,true)[0] as! String        let path = documentsFolder.stringByAppendingPathComponent("contacts.db")        let database = FMDatabase(path: path)        if !database.open() {            println("Unable to open database")            return        }        if !database.executeUpdate("create table test(x text,withArgumentsInArray: nil) {            println("create table Failed: \(database.lastErrorMessage())")        }        if !database.executeUpdate("insert into test (x,"c"]) {            println("insert 1 table Failed: \(database.lastErrorMessage())")        }        if !database.executeUpdate("insert into test (x,"g"]) {            println("insert 2 table Failed: \(database.lastErrorMessage())")        }        if let rs = database.executequery("select x,withArgumentsInArray: nil) {            while rs.next() {                let x = rs.stringForColumn("x")                let y = rs.stringForColumn("y")                let z = rs.stringForColumn("z")                println("x = \(x); y = \(y); z = \(z)")            }        } else {            println("select Failed: \(database.lastErrorMessage())")        }        database.close()    }    overrIDe func dIDReceiveMemoryWarning() {        super.dIDReceiveMemoryWarning()        // dispose of any resources that can be recreated.    }}

要测试,只需使用Build and Run按钮,您应该看到在Xcode的控制台中运行模拟器和以下结果:

x = a; y = b; z = cx = e; y = f; z = g

要显示控制台,请键入Shift CMD R或转到视图 – >调试区域 – >激活控制台

总结

以上是内存溢出为你收集整理的sqlite – 如何在swift中捆绑预先填充的数据库全部内容,希望文章能够帮你解决sqlite – 如何在swift中捆绑预先填充的数据库所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/sjk/1178690.html

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

发表评论

登录后才能评论

评论列表(0条)

保存