2011-12-14 7 views
1

は奇妙な問題を抱えて代わるものではありません。それはちょうど、sqliteのINTO REPLACEは、

[[DatabaseController getInstance].resultsDB executeUpdate:@"REPLACE INTO user_results (gameID, gameDesc, result) VALUES (?, ?, ?)",[NSNumber numberWithInt:self.gameID],[test JSONRepresentation],[NSNumber numberWithInt:sumBalls]]; 

しかし、問題は、それは同じgameIDで行を置き換えるものではありませんということです。

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

それから私は、クエリを実行します。私は私のObjective-Cのアプリでsqliteのテーブルを持っています1つを追加します(それはUNIQUEですが)、なぜそれが起こるでしょうか?

P.S. FMDBを使ってsqliteを操作しています。

ありがとうございます。

ソリューション: の代わりにを使用しなければなりませんでした。

答えて

0

gameIDフィールドは、PRIMARY KEY,IDではありません。あなたが持っているので、REPLACE INTOIDフィールドでのみ動作します。 gameIDフィールドを主キーにして、探している結果を取得することをお勧めします。

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

いや、gameIDはすでにUNIQUE列なので、INTOが正常に動作し、それが非ユニークになるだろう任意の行を削除する必要がありREPLACE。 –

+0

それは本当です。 UNIQUE列を上書きしないでください。INSERTの代わりにREPLACEを呼び出す必要があります。 –

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 

INTOは何を期待しREPLACE:

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行は追加されませんでした。これは、1つを削除し、1を追加した(つまり、「置き換え」:)

あなたの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はそのような列を作成します。

+0

実際に問題が見つかりました。私のexecuteUpdate【のNSNumber numberWithInt:sumBalls]に送信したとして 、実際sumBalls値を送信しないました。 '[NSNumber numberWithInt:self.gameID] .i​​ntegerValue' トリックしました。ありがとう。 –

関連する問題