2010-07-20 93 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