REPLACE INTO sqlite不会替换

时间:2011-12-14 00:02:55

标签: objective-c sqlite

遇到了一个奇怪的问题。我的objective-c应用程序中有一个sqlite表:

NSString *sql = @"CREATE TABLE IF NOT EXISTS user_results (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, gameID INTEGER UNIQUE, gameDesc TEXT, result INTEGER)";

然后我执行查询:

[[DatabaseController getInstance].resultsDB executeUpdate:@"REPLACE INTO user_results (gameID, gameDesc, result) VALUES (?, ?, ?)",[NSNumber numberWithInt:self.gameID],[test JSONRepresentation],[NSNumber numberWithInt:sumBalls]];

但问题是它不会用相同的gameID替换行,它只会添加一行(即使它是UNIQUE),任何想法为什么会发生?

P.S。我正在使用FMDB来处理sqlite。

提前致谢。

解决方案:在发送到sql查询时,不得不使用[NSNumber numberWithInt:self.gameID].integerValue而不是[NSNumber numberWithInt:self.gameID]

2 个答案:

答案 0 :(得分:2)

您的架构是否已更改,以后是否添加了UNIQUE约束?你的架构& SQL应该按预期工作。我刚试过这个并且工作正常:

sqlite3
CREATE TABLE IF NOT EXISTS user_results (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, gameID INTEGER UNIQUE, gameDesc TEXT, result INTEGER);
insert into user_results values (1,1,'hi', 1);  --insert 2 test rows
insert into user_results values (2,2,'2', 2);
select * from user_results;

1|1|hi|1
2|2|2|2

现在插入失败了:

insert into user_results values (3,1,'1', 1);
Error: column gameID is not unique

REPLACE INTO符合您的期望:

replace into user_results (gameid, result) values (2, 3);
select * from user_results;
1|1|hi|1
3|2||3

它删除了id为2的行,并将其替换为新的行ID 3和gameid 2.除非你期望它替换主键= 2行? Sqlite所做的是删除任何先前会导致违反唯一键的行,然后插入一个新行。见http://www.sqlite.org/lang_conflict.html。请注意,它没有添加EXTRA行。它删除了一个并添加了一个(换句话说,'替换':)

如果你的替换为SQL包含了id列,那就行了,这里我正在有效地更新id为3的行。当然你必须找出你要替换的行的id ...

replace into user_results values (3,3,'2', 2);
select * from user_results;
1|1|hi|1
3|3|2|2

你真正关心的是id列吗?无论如何,Sqlite会为你创建这样一个列。

答案 1 :(得分:0)

gameID字段不是PRIMARY KEYID是。如您所知,REPLACE INTO仅适用于ID字段。我建议将gameID字段作为主键来获取您要查找的结果。

NSString *sql = @"CREATE TABLE IF NOT EXISTS user_results (gameID INTEGER PRIMARY KEY, gameDesc TEXT, result INTEGER)";