web-dev-qa-db-ja.com

SQLiteの自動インクリメントが機能しない

わかりました、これはスパムではなく、単純なはずです。なぜそれが機能しないのかわかりません。これが私のコードです。

gamesdatabase = openOrCreateDatabase("GamesDatabase", MODE_PRIVATE, null);
gamesdatabase.execSQL("CREATE TABLE IF NOT EXISTS Games (ID INTEGER PRIMARY KEY, Name
VARACHAR, NPlayers INT(1), NRounds INT(2), WinScore INT(2));");

gamesdatabase.execSQL("INSERT INTO Games 
(ID, Name, NPlayers, NRounds, WinScore ) VALUES ( NULL, 'TAWLA',2,0,0 );");

gamesdatabase.execSQL("INSERT INTO Games 
(ID, Name, NPlayers, NRounds, WinScore ) VALUES ( NULL, 'DOMANA',4,0,0 );");


Cursor c = gamesdatabase.rawQuery("SELECT * FROM Games", null);
c.moveToFirst();
while (c.isAfterLast() == false) {
Log.d("BEZRA", String.valueOf(c.getInt(c.getColumnIndex("ID"))));
c.moveToNext();
}

これの何が問題になっていますか?ログには、すべてのレコードに対して0が表示されます

9
BezrA

SQLiteテーブルの主キーは_idと呼ばれます。これは自動インクリメントであり、値を挿入しようとしないでください。

gamesdatabase = openOrCreateDatabase("GamesDatabase", MODE_PRIVATE, null);
gamesdatabase.execSQL("CREATE TABLE IF NOT EXISTS Games (_id INTEGER PRIMARY KEY, Name
VARACHAR, NPlayers INT(1), NRounds INT(2), WinScore INT(2));");

gamesdatabase.execSQL("INSERT INTO Games 
(Name, NPlayers, NRounds, WinScore ) VALUES ('TAWLA',2,0,0 );");

gamesdatabase.execSQL("INSERT INTO Games 
(Name, NPlayers, NRounds, WinScore ) VALUES ('DOMANA',4,0,0 );");


Cursor c = gamesdatabase.rawQuery("SELECT * FROM Games", null);
c.moveToFirst();
while (c.isAfterLast() == false) {
Log.d("BEZRA", String.valueOf(c.getInt(c.getColumnIndex("_id"))));
c.moveToNext();
}
28
Philip Sheard

私にとってうまくいったのは、作成タイプの名前をINTからINTEGERに変更することで、それが機能し始めました。

これから:

CREATE TABLE IF NOT EXISTS foo (id INT PRIMARY KEY, bar INT)

これに:

CREATE TABLE IF NOT EXISTS foo (id INTEGER PRIMARY KEY, bar INT)
6
Ryan Knell

c.getColumnIndex("ID")は、列のインデックスを取得します。IDは0のインデックス付き列、名前は1などです。

あなたが欲しい

c.getInt(c.getColumnIndex("ID"))

2
Patrick Evans

ご覧いただけます http://alvinalexander.com/Android/sqlite-autoincrement-serial-identity-primary-key CRETAE_TABLE

  CREATE TABLE salespeople (
  id INTEGER PRIMARY KEY,
  first_name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  commission_rate REAL NOT NULL
);

INSERT_DATA

 INSERT INTO salespeople VALUES (null, 'Fred', 'Flinstone', 10.0);

---または---

INSERT INTO salespeople (first_name, last_name, commission_rate) VALUES ('Fred', 'Flinstone', 10.0);
1
user3313585

列が自動インクリメントされていることを伝えたいと思います。

ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL

代わりに。

0
Graham Borland