无法在Android SQlite数据库中插入数据

无法在Android SQlite数据库中插入数据,android,sqlite,Android,Sqlite,我无法在Android Sqlite数据库中插入记录, 引发的异常如下所示: insertQuery函数如下所示: public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY,

我无法在Android Sqlite数据库中插入记录, 引发的异常如下所示:

insertQuery函数如下所示:

public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }


public void insertContact(){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(KEY_ID, "1");
        values.put(KEY_NAME, "Rajan");
        values.put(KEY_PH_NO, "9990008973");

        db.insert(TABLE_NAME, null, values);
        db.close();
    }

执行时的代码返回异常。数据库已成功创建,但我无法将记录插入其中

整数主键会自动生成,不应指定它。要解决问题,只需删除此行:

values.put(KEY_ID, "1");
如果您想获得ID,则在长时间调用时会返回,如下所示:

Long id = db.insert(TABLE_NAME, null, values);

有关如何在Android中使用SQLite的更多信息,请参阅教程:

INTEGER主键自动生成,不应指定它。要解决问题,只需删除此行:

values.put(KEY_ID, "1");
如果您想获得ID,则在长时间调用时会返回,如下所示:

Long id = db.insert(TABLE_NAME, null, values);
有关如何在Android中使用SQLite的更多信息,请参阅教程:

删除
values.put(KEY_ID,“1”)这是因为您的
密钥\u ID
是主键。主键必须是唯一的

当您再次插入一条记录时,已经找到一条id较旧的记录。因此,它会给出约束失败错误。

删除
值。放置(KEY_id,“1”)这是因为您的
密钥\u ID
是主键。主键必须是唯一的


当您再次插入一条记录时,已经找到一条id较旧的记录。因此,它给出了约束失败错误。

我不确定您对键id的看法是否错误。主键应该能够存储任何内容,只要每行都是唯一的。 一列可以是主键,而不是自动递增的整数,它应该可以正常工作
但是,当您在android中工作时,如果您定义一个名为“\u id”的列作为主键会更好。你会得到这样的东西

String KEY_ID = "_id";
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER    PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";

我不确定你对KEY_ID的看法是否错误。主键应该能够存储任何内容,只要每行都是唯一的。 一列可以是主键,而不是自动递增的整数,它应该可以正常工作
但是,当您在android中工作时,如果您定义一个名为“\u id”的列作为主键会更好。你会得到这样的东西

String KEY_ID = "_id";
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER    PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";

由于已定义ID主键,因此无法为其赋值!只需删除该部分:

values.put(KEY_ID, "1");

强烈建议在数据库的ID字段中添加“AUTO_INCERMENT”以生成唯一的ID

由于已定义ID主键,因此无法为其赋值!只需删除该部分:

values.put(KEY_ID, "1");

强烈建议在数据库的ID字段中添加“AUTO_INCERMENT”以生成唯一的ID

因为如果记录ID已存在,SQLite尝试按ID插入时会出现错误

尝试使用一些解决方案:

  • 通过无ID参数创建新函数,并将自动增量添加到ID中
  • 添加自动递增:
    KEY\u ID+“整数主键自动递增,

    删除:
    values.put(KEY_ID,“1”);

  • 按最后一个要插入的ID创建新函数

  • 因为如果记录ID已存在,SQLite尝试按ID插入时会出现错误

    尝试使用一些解决方案:

  • 通过无ID参数创建新函数,并将自动增量添加到ID中
  • 添加自动递增:
    KEY\u ID+“整数主键自动递增,

    删除:
    values.put(KEY_ID,“1”)

  • 按最后一个要插入的ID创建新函数
  • 而不是这个

    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";
    
    这是我写的

    String CREATE_CONTACTS_TABLE = "CREATE TABLE TABLE_NAME  (" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";
    
    而不是这个

    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";
    
    这是我写的

    String CREATE_CONTACTS_TABLE = "CREATE TABLE TABLE_NAME  (" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_PH_NO + " TEXT" + ")";
    

    删除此
    值。放置(键ID,“1”)因为您的
    键ID
    是主键删除此
    值。放置(键ID,“1”)
    因为您的
    密钥\u ID
    是主键实际上,您可以指定主键值,只要它是唯一的或指定了冲突解决算法。大多数情况下,您只是不想指定它。@laalto是否需要在
    SQLite
    中将主键定义为
    Auto Increment
    。(考虑到这些基本问题)我更新了我的答案,以解决这个问题。谢谢。@MD否,
    AUTOINCREMENT
    关键字只是稍微改变了id生成算法的工作方式。实际上,您可以指定主键值,只要它是唯一的或指定了冲突解决算法。大多数情况下,您只是不想指定它。@laalto是否需要在
    SQLite
    中将主键定义为
    Auto Increment
    。(考虑到这些基本问题)我更新了我的答案,以解决这个问题。谢谢。@MD否,
    AUTOINCREMENT
    关键字只是稍微改变了id生成算法的工作方式。