Objective c 替换为sqlite不';不能代替

Objective c 替换为sqlite不';不能代替,objective-c,sqlite,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 ex

有个奇怪的问题。我的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
替换行,它只是添加了一个(即使它是
唯一的
),你知道为什么会这样吗

另外,我正在使用FMDB与sqlite一起工作

提前谢谢


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

gameID
字段不是
主键,而
ID
是。如您所知,
REPLACE INTO
将只与
ID
字段一起使用。我建议将
gameID
字段设为主键,以获取您要查找的结果

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

您的模式是否已更改,并在以后添加了唯一约束?您的模式和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所做的是删除任何可能导致违反唯一键的先前行,然后插入新行。看见注意,它没有添加额外的行。它删除了一个,增加了一个(换言之,“替换”:

如果您在SQL中的replace包含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无论如何都会为您创建这样一个列。

不,gameID已经是唯一的列,所以替换为应该可以正常工作,并删除任何会使其不唯一的行。这是真的。唯一列不应该被覆盖,所以应该调用REPLACE而不是INSERT。我发现了一个问题。当我向executeUpdate发送[NSNumber numberWithInt:sumBalls]时,它并没有发送实际的sumBalls值<代码>[NSNumber numberwhithint:self.gameID].integerValue
成功了。谢谢