SQLite FMDB 创建表 - iOS 初学者

7

我想这是一个简单的问题,但我在FMDB git页面上没有找到答案。当你使用以下命令时:

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

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

我是否可以在我的类初始化程序中调用此方法而不创建多个表?

如果这个问题很愚蠢,那我很抱歉。

3个回答

15

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

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

或者,您可以使用以下方式检查其是否存在:

select sql from SQLITE_MASTER where name = 'test_table'

看看是否能获得任何结果返回。


0
每当您向 FMDB 发出 CREATE TABLE 命令时,它会将其内部转换为相应的 SQLite 查询(您无需担心)。
根据 SQLite 网站上给出的官方文档,它指出:
“尝试在已经包含同名表、索引或视图的数据库中创建新表通常是错误的。”
因此,如果您尝试以相同的名称创建另一个表,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


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




    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接