SQLite FMDB 创建表 - 初学者 iOS

Posted

技术标签:

【中文标题】SQLite FMDB 创建表 - 初学者 iOS【英文标题】:SQLite FMDB creating table - beginner iOS 【发布时间】:2012-11-06 00:03:05 【问题描述】:

我认为这是一个简单的问题,但我没有在 FMDB git 页面中找到答案。 使用命令时:

[database executeUpdate:@"create table T_table(name text primary key, age int)"];

FMDB 或 SQLite 是否会进行某种验证以查看表是否已存在?

我可以在我的类初始化器中调用这个方法而不创建多个表吗?

抱歉,如果是愚蠢的问题。

【问题讨论】:

【参考方案1】:

另一种解决方案是将您的查询更改为:

create table if not exists test_table (test_no NUMBER, test_name TEXT);

或者,您可以使用以下命令检查是否存在:

select sql from SQLITE_MASTER where name = 'test_table'

然后看看你是否得到任何结果。

【讨论】:

【参考方案2】:

每当您向 FMDB 发出 CREATE TABLE 命令时,它都会在内部将其转换为相应的 SQLite 查询(您不必担心)。

根据 SQLite 网站上给出的官方文档,它指出:

"It is usually an error to attempt to create a new table in a database that already contains a table, index or view of the same name."

所以,如果你尝试创建另一个同名的表,SQLite 会抛出一个错误:

create table test_table (test_no NUMBER, test_name TEXT); //Table created

/* Now, try creating the table again */
create table test_table (test_no NUMBER, test_name TEXT); 

您将收到以下错误。错误:表 test_table 已存在

所以,SQLite 会检查表是否存在,它不会允许另一个同名的表。

同样,您可以参考文档以获取更多详细信息。

来源 http://www.sqlite.org/lang_createtable.html

【讨论】:

感谢您的详细解答。【参考方案3】:
var databasePath = String()
    override func viewDidLoad() 
        super.viewDidLoad()

        let filemgr = FileManager.default
        let dirPaths = filemgr.urls(for: .documentDirectory,
                                    in: .userDomainMask)

        databasePath = dirPaths[0].appendingPathComponent("contacts.db").path

        if !filemgr.fileExists(atPath: databasePath as String) 

            let contactDB = FMDatabase(path: databasePath as String)

            if contactDB == nil 
                print("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)) 
                    print("Error: \(contactDB.lastErrorMessage())")
                
                contactDB.close()
             else 
                print("Error: \(contactDB.lastErrorMessage())")
            
        
        save()

        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    
    func save()
    
        let contactDB = FMDatabase(path: databasePath as String)

        if (contactDB.open()) 

            let insertSQL = "INSERT INTO CONTACTS (name, address, phone) VALUES ('\("abc")', '\("abc")', '\("1234")')"

            let result = contactDB.executeUpdate(insertSQL,
                                                  withArgumentsIn: [])

            if !result 
                //status.text = "Failed to add contact"
                print("Error: \(contactDB.lastErrorMessage())")
            
            else
            
                getData()
//                status.text = "Contact Added"
//                name.text = ""
//                address.text = ""
//                phone.text = ""
            
         else 
            print("Error: \(contactDB.lastErrorMessage())")
        
    

   func getData()
    
        let contactDB = FMDatabase(path: databasePath as String)

        if (contactDB.open()) 
          //  let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = '\(name.text!)'"
            let querySQL = "SELECT ID,address, phone FROM CONTACTS"

            let results:FMResultSet? = contactDB.executeQuery(querySQL,
                                                               withArgumentsIn: [])

            while results?.next() == true
            
                let id = results?.string(forColumn: "ID")
                //(forColumn: "address")
                let phone = results?.string(forColumn: "phone")
                print(phone ?? "")
                print("\(id)")
                //status.text = "Record Found"
            
//            else
//            
//                print("")
//               // status.text = "Record not found"
//               // address.text = ""
////phone.text = ""
//            
            contactDB.close()
        
        else
        
            print("Error: \(contactDB.lastErrorMessage())")
        




    


【讨论】:

以上是关于SQLite FMDB 创建表 - 初学者 iOS的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发--SQLite重要框架FMDB的使用

如何在 FMDB 中的两个表之间创建或稳定关系?

iOS Swift 插入 sqlite FMDB

iOS sqlite/FMDB 更新不起作用

FMDB 如何让 sqlite 更简单 iOS?

iOS的SQLite利用FMDB进行操作时无法打开数据库