android.database.sqlite.SQLiteConstraintException:columnidisnotunique(代码19)android.database.sqlite.SQLiteConstraintException

android.database.sqlite.SQLiteConstraintException:columnidisnotunique(代码19)android.database.sqlite.SQLiteConstraintException,android,database,sqlite,Android,Database,Sqlite,第一次插入行时,它不会出现任何问题。但在同一设备中安装应用程序(从eclipse安装而不从设备卸载应用程序)并尝试插入新行后,会引发异常 10-1216: 36: 38.405: E/AndroidRuntime(32429): Causedby:android.database.sqlite.SQLiteConstraintException: columnidisnotunique(code19) 10-12 16:36:38.405: E/AndroidRuntime(32429): Ca

第一次插入行时,它不会出现任何问题。但在同一设备中安装应用程序(从eclipse安装而不从设备卸载应用程序)并尝试插入新行后,会引发异常

10-1216: 36: 38.405: E/AndroidRuntime(32429): Causedby:android.database.sqlite.SQLiteConstraintException: columnidisnotunique(code19)
10-12 16:36:38.405: E/AndroidRuntime(32429): Caused by: android.database.sqlite.SQLiteConstraintException: column id is not unique (code 19)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1565)
10-12 16:36:38.405: E/AndroidRuntime(32429):    at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1514)
创建表:

    public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_USER_DATA + "("
            + KEY_ID + " TEXT PRIMARY KEY," + KEY_TIMESTAMP + " TEXT,"
            + KEY_JSON_DATA + " TEXT" + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}
插入:

    public void addJsonData(JSONDataStore dataStore) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ID, dataStore.getKey());
    values.put(KEY_TIMESTAMP, dataStore.getTimeStamp());
    values.put(KEY_JSON_DATA, dataStore.getJsonData());

    db.insert(TABLE_USER_DATA, null, values);
}
升级:

    @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER_DATA);

    onCreate(db);
}
插入时出现异常:

    db.insert(TABLE_USER_DATA, null, values);

错误告诉您正在尝试为定义为
主键的列
ID
创建具有相同值的两行。为了让sqlite为您创建自动增量ID值,只需删除这一行-

values.put(KEY_ID, dataStore.getKey());

并将列声明为
INTEGER

错误告诉您正在尝试为定义为
主键的列
ID
创建具有相同值的两行。为了让sqlite为您创建自动增量ID值,只需删除这一行-

values.put(KEY_ID, dataStore.getKey());

并将列声明为
INTEGER

,但在我的示例中,主键应该仅为string。我想将json文件名存储为key,timestamp(json下载时间)值和json字符串存储为另一个值,用于缓存目的,我正在存储timestamp。如何做到这一点???json名称是唯一的吗?您应该确保在插入前搜索具有给定名称的行,如果存在,则更新而不是插入。但在我的情况下,主键应仅为字符串。我想将json文件名存储为key,timestamp(json下载时间)值和json字符串存储为另一个值,用于缓存目的,我正在存储timestamp。如何做到这一点???json名称是唯一的吗?您应该确保在插入前搜索具有给定名称的行,如果存在,则更新而不是插入。