【问题标题】:Android - SQLite AUTOINCREMENT not incrementing primary keyAndroid - SQLite AUTOINCREMENT 不增加主键
【发布时间】:2014-03-05 19:22:34
【问题描述】:

我搜索了堆栈溢出,但找不到解决方案。 这是我的 SQLite onCreate 代码。

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

我使用它从适配器(DbTools)插入

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 是定义来自编辑文本字段的用户输入的变量。

当我通过调用 toast 检查数据库时,除了作为 Null 插入的 cardID 之外,所有内容都被插入。 怀疑我的 toast 检查,我下载了一个数据库查看器,还发现 cardID 为空。

有什么建议吗?

【问题讨论】:

    标签: android sqlite auto-increment


    【解决方案1】:

    cardID INTEGER PRIMARY KEY AUTOINCREMENT 替换为cardID 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);
    }
    

    您不必像在 SQLite 中那样专门写 AUTO_INCREMENT

    只需要将主键字段定义为_id INTEGER PRIMARY KEY

    【讨论】:

    • 为什么没有定义AUTO_INCREMENT?
    • 仍然给出 null 作为结果。
    • @IrfanMaulana:插入值后你会关闭数据库吗?
    • @AnilBhatiya Closing 也无济于事,因为我已经在 db 工具中定义了它。没有在代码中包含它。现已编辑。
    【解决方案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);
    

    【讨论】:

    • 仍然给出结果为空。
    • @IrfanMaulana :我编辑了我的答案。试试那个代码。这对我来说很容易并且工作正常。
    • @ShaunzzDroid 谢谢,我想通了。查看我编辑的帖子。 :)
    • 感谢兄弟,它对我来说很好用..因此我投票给你 :)
    • 我有一个问题,你能告诉我数据库类中构造函数有什么用吗?
    【解决方案3】:

    我已经读到(在 Android Studio Development Essentials 中)Android 对主键的名称很挑剔,并希望它始终是 _id

    另外,根据How to make AUTO_INCREMENT on Android SQLite database?,自动增量是隐含的,应该避免。

    因此,请尝试使用以下内容:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 2011-06-02
      • 2020-06-05
      • 2012-11-24
      • 2011-10-22
      • 2013-08-11
      • 2010-10-31
      相关资源
      最近更新 更多