gpt4 book ai didi

objective-c - 更换成sqlite不能替代

转载 作者:行者123 更新时间:2023-12-03 19:03:53 26 4
gpt4 key购买 nike

有一个奇怪的问题。我的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),有什么想法为什么会发生?

附言我正在使用FMDB与sqlite一起使用。

提前致谢。

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

最佳答案

您的架构是否已更改,并在以后添加了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 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。请注意,它没有添加额外的行。它删除了一个并添加了一个(换句话说,“已替换” :)

如果您要替换的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都会为您创建一个这样的列。

关于objective-c - 更换成sqlite不能替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com