Objective c 替换为sqlite不';不能代替
有个奇怪的问题。我的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
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
成功了。谢谢