遇到了一个奇怪的问题。我的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]
。
答案 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 KEY
,ID
是。如您所知,REPLACE INTO
仅适用于ID
字段。我建议将gameID
字段作为主键来获取您要查找的结果。
NSString *sql = @"CREATE TABLE IF NOT EXISTS user_results (gameID INTEGER PRIMARY KEY, gameDesc TEXT, result INTEGER)";