2014-02-08 51 views
2

我搜索了周圍的堆棧溢出,並找不到解決方案。 這是我用於SQLite的onCreate代碼。Android - SQLite的AUTOINCREMENT不增加主鍵

public void onCreate(SQLiteDatabase database) { 
    String query = "CREATE TABLE cards (cardID INTEGER PRIMARY KEY AUTOINCREMENT, question VARCHAR, answer VARCHAR, subject VARCHAR)"; 
    database.execSQL(query); 
} 

我用它來從適配器(DBTool中)插入

public void insertCard(HashMap<String, String> queryValues) { 

    SQLiteDatabase database = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put("question", queryValues.get("question")); 
    values.put("answer", queryValues.get("answer")); 
    values.put("subject", queryValues.get("subject")); 

    database.insert("cards", null, values); 
    database.close(); 

} 

這是我將數據插入到數據庫的方式。

HashMap<String, String> Values = new HashMap<String, String>(); 
Values.put("question", newQuestion); 
Values.put("answer", newAnswer); 
Values.put("subject", newSubject); 
dbTools.insertCard(Values); 

其中newQuestion,newAnswer和newSubject是定義來自edittext字段的用戶輸入的變量。

當我通過調用toast來檢查數據庫時,插入的所有內容都將被插入,但插入的cardID爲null。 懷疑我的烤麪包檢查,我下載了一個數據庫查看器,並發現cardID爲空。

有什麼建議嗎?

回答

2

更換cardID INTEGER PRIMARY KEY AUTOINCREMENTcardID INTEGER PRIMARY KEY

public void onCreate(SQLiteDatabase database) { 
    String query = "CREATE TABLE cards (cardID INTEGER PRIMARY KEY, question VARCHAR, answer VARCHAR, subject VARCHAR)"; 
    database.execSQL(query); 
} 

你不必專門寫AUTO_INCREMENT在SQLite的。

只需將主鍵字段定義爲_id INTEGER PRIMARY KEY

+1

任何理由? –

+0

仍然給出null作爲結果。 –

+1

@MD看看這個鏈接 http://sqlite.org/autoinc.html –

2

試試這個:

integer primary key autoincrement not null 

那麼這將是:

String query = "CREATE TABLE cards (cardID integer primary key autoincrement not null, question VARCHAR, answer VARCHAR, subject VARCHAR)"; 

編輯

只檢查我的代碼:

import java.util.ArrayList; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class AABDatabaseManager 
{ 
Context context; 
private SQLiteDatabase db; 
private final String DB_NAME = "MY_DB"; 
private final int DB_VERSION = 1; 

public AABDatabaseManager(Context context) 
{  
      this.context = context; 
    CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context); 
    this.db = helper.getWritableDatabase(); 
} 

public void addRow(String StringOne, String StringTwo) 
{ 
    ContentValues values = new ContentValues(); 
    values.put("Username", StringOne); 
    values.put("Passwrd", StringTwo); 
    try{ 
       db.insert("My_table", null, values); 
      } 
    catch(Exception e) 
    { 
     Log.e("DB ERROR", e.toString()); 
     e.printStackTrace(); 
    } 
} 

private class CustomSQLiteOpenHelper extends SQLiteOpenHelper 
{ 
    public CustomSQLiteOpenHelper(Context context) 
    { 
     super(context,DB_NAME,null,DB_VERSION); 
    } 


    public void onCreate(SQLiteDatabase db) 
    { 
     String query = "CREATE TABLE My_table(ID integer primary key autoincrement not null, Username text, Passwrd text)";       ");";  
     db.execSQL(query); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 

    } 
} 

點插入的數據是這樣的:

AABDatabaseManager db = new AABDatabaseManager(this); 
db.addRow(Stringvalue1,Stringvalue2); 
+0

仍給出結果爲空。 –

+0

@IfanfanMaulana:我編輯了我的答案。試試這個代碼。這很容易,對我來說工作很好。 – Shahina

+0

@ShaunzzDroid謝謝,我想通了。看看我編輯過的帖子。 :) –

0

我已閱讀(Android Studio中開發綱要)是Android是挑剔的主鍵的名稱,並希望它永遠是_id

此外,根據How to make AUTO_INCREMENT on Android SQLite database?暗示自動增量,應該避免。

因此,請嘗試使用以下:爲什麼不定義AUTO_INCREMENT

public void onCreate(SQLiteDatabase database) { 
    String query = "CREATE TABLE cards (_ID INTEGER PRIMARY KEY, question VARCHAR, answer VARCHAR, subject VARCHAR)"; 
    database.execSQL(query); 
}