2010-07-20 57 views
0

嗨我想要做的是更新表,如果字段存在或插入新的值由用戶給出。sqlite中的更新語句

爲此,我所做的是選擇表中的所有內容,並檢查用戶輸入的名稱是否存在更新或插入。

但是問題是當表中沒有數據時查詢失敗並且沒有數據插入到表中。

NSString *query = @"select * from PPM"; 
sqlite_stmt *statement; 

if(sqlite_prepare_v2(database,[query UTF8string],-1,&statement,NULL) == SQLITE_OK) 
{ 
    while (sqlite3_step(statement) == SQLITE_ROW) 
    //select data from table 
    //if value entered is same as entered by user update the table 
    //else insert in the table 
} 
+0

向我們顯示您的查詢或關於數據結構的信息。否則答案將是非常通用的。 – MJB 2010-07-20 12:48:20

+0

我不想更換數據,但更新數據,所以我需要數據庫中的現有數據,需要做一些操作,然後更新該字段。我該怎麼做? – user391301 2010-07-21 06:42:05

回答

3

INSERT OR REPLACE怎麼樣? 您可以將它與數據庫結構中的UNIQUE約束一起使用,以便在值已存在的情況下替換該值,如果該值尚未存在,則將其插入。

shell> sqlite3 
SQLite version 3.6.23 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> CREATE TABLE user(name UNIQUE, value); 
sqlite> INSERT OR REPLACE INTO user VALUES("foo", 123); 
sqlite> SELECT * FROM user; 
foo|123 
sqlite> INSERT OR REPLACE INTO user VALUES("foo", 321); 
sqlite> SELECT * FROM user; 
foo|321 
+0

我不想更換數據,但更新數據,所以我需要數據庫中的現有數據,需要做一些操作,然後更新該字段。我該怎麼做? – user391301 2010-07-21 06:28:39

1

如果使用INSERT或更換INSERT命令的變化,你並不需要檢查現有數據,SQLite的會爲你做的,只要有一個獨特的約束的列。

例如:

CREATE TABLE db.table(id UNIQUE, name); 

INSERT OR REPLACE INTO db.table (id, name) VALUES (5, 'exep'); 

如果5的ID的表存在,此命令會像更新,否則這將是一個插入。

請參閱http://www.sqlite.org/lang_conflict.html瞭解更多詳情。

+0

列不必指定爲UNIQUE,使用主鍵也可以。 – MPelletier 2010-07-20 13:32:45

+0

除非它是INTEGER PRIMARY KEY,否則sqlite中的主鍵會創建唯一的索引,請參閱http://www.sqlite.org/lang_createtable.html。 – SirDarius 2010-07-20 13:36:45

+0

我不想更換數據,但更新數據,所以我需要數據庫中的現有數據,需要做一些操作,然後更新該字段。我該怎麼做? – user391301 2010-07-21 06:42:52