ЗАМЕНА В sqlite не заменяет - PullRequest
1 голос
/ 14 декабря 2011

есть странная проблема.У меня есть таблица sqlite в моем приложении target-c:

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), есть идеи, почему это произойдет?

PS Я использую FMDB для работы с sqlite.

Заранее спасибо,

Решение: При отправке запроса sql пришлось использовать [NSNumber numberWithInt:self.gameID].integerValue вместо [NSNumber numberWithInt:self.gameID].

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Изменилась ли ваша схема с добавлением ограничения 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

Он удаленстроку с идентификатором 2 и заменили ее новым идентификатором строки 3 и gameid 2. Разве вы не ожидали, что он заменит первичный ключ = 2 строки?Что делает Sqlite, так это удаляет все предыдущие строки, которые могут привести к нарушению уникального ключа, а затем вставляет новую строку.См. http://www.sqlite.org/lang_conflict.html. Обратите внимание, что это не добавило ДОПОЛНИТЕЛЬНУЮ строку.Он удалил один и добавил один (другими словами, «replace»:)

Если ваша замена в SQL включает столбец id, это будет работать, здесь я эффективно обновляю строку с идентификатором 3. Конечно,вам нужно будет определить идентификатор строки, которую вы хотите заменить ...

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

Столбец идентификатора действительно вас интересует?В любом случае Sqlite создаст для вас такую ​​колонку.

0 голосов
/ 14 декабря 2011

Поле 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)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...