斯威夫特和 SQLite

Posted

技术标签:

【中文标题】斯威夫特和 SQLite【英文标题】:Swift and SQLite 【发布时间】:2015-04-27 09:14:42 【问题描述】:

我正在关注在 Swift 上使用 SQLite 的教程,一切正常(代码如下)。我对数据库本身感到困惑。如果专家能向我澄清以下问题,我将不胜感激: 1- 我希望数据库成为离线使用的应用程序的一部分 我的意思是用户将下载包含数据库的应用程序,我应该在哪里复制数据库本身? 2- 我试图将数据库复制到支持文件夹,但是当应用程序在我的 iphone 中运行时,数据库没有复制到我的 iphone。而不是我必须在 iphone3 中构建一个新数据库 - 数据库会很大,所以我不想在应用程序中构建它(我计划使用 Firefox SQLite 管理器从 excel 复制数据,替代方案非常欢迎复制)。 任何提示都非常受欢迎。提前致谢。

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())")
        
    

【问题讨论】:

【参考方案1】:

创建自己的数据库并将数据库放入您的xcode项目中(只需将数据库拖到xcode项目中)并使用以下代码将数据库复制到您的应用程序中

 override func viewDidLoad() 
    super.viewDidLoad()

    var fileManager = NSFileManager.defaultManager()
    var Sourcepath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("DataBase.db");
    let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as! String
    let databaseStr = "DataBase.db"
    let dbPath = docsPath.stringByAppendingPathComponent(databaseStr)
    //check for database existance if not exsit than copy the database destination path
    if(fileManager .fileExistsAtPath(dbPath) == false) 
        var error:NSError?
        fileManager.copyItemAtPath(Sourcepath!, toPath: dbPath, error: &error)
    

一旦数据库被复制到应用程序包中 1) 将 libsqlite3.dylib 添加到您的项目 添加转到 application target ->Build Phases ->Link Binary With Libraries 并点击 +

2) 将#import <sqlite3.h>这一行导入Objective-C桥头文件 创建桥头请参阅此How to use Objective-C Classes in Swift 知道您将能够在您的 swift 代码中访问所有 sqlite 方法

【讨论】:

嗨,我应该在哪里插入您的代码?我遇到了一些错误 viewDidload() 函数 或应用程序 didFinishLaunchingWithOptions 方法 我删除我的代码并插入你的,没有错误,但仍然无法检索我在数据库中插入的联系人:( 如果您在模拟器中运行应用程序,只需在我的代码中添加 println(dbPath) 它将为数据库保存路径打开路径并检查您的数据库是否实际插入值?【参考方案2】:

我认为你不能在 Swift 中插入数据库,如果我记得它是专有的,所以你不能在应用程序之外进行编辑......

【讨论】:

也许在 CoreData 上是正确的,但我正在尝试使用 FMDB

以上是关于斯威夫特和 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特:'!'的区别和 '?'迅速

从 KeyChain 保存和加载 |斯威夫特 [重复]

如何从解析中注册通知以获取声音和警报? (在斯威夫特)

斯威夫特和 SQLite

AND 和 OR 与 NSPredicate 结合。 IOS 斯威夫特

解析和斯威夫特。从 Parse 关系中设置 tableViewCell 附件类型