Android自带的数据库不支持主键id的改动,删除一个中间的记录后id变得断断续续的,id将无法正确指明记录的正确位置。于是新增加一列integer型的_id替代id,对应记录的真实位置,在创建表,删除记录,添加记录时对它进行相应改动,使它始终正确的指向记录。
下面举一例:
(1)创建表。在原有的列中多增一列_id:
String sql = "create table Note(" +
"id integer primary key autoincreme, "+
"name text, " + "_id integer)";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sql);
}
(2)添加记录。将最后一条记录的_id值加1赋值给新添加记录的_id,当然如果数据库是空的,就直接给它赋值为0:
Cursor cursor = dbWriter.query("Note", null, null, null, null, null,
null);
if (!cursor.moveToFirst()) {
ID = 0;
} else {
cursor.moveToLast();
ID = cursor.getInt(cursor.getColumnIndex("_id"));
ID++;
}
String sql = "insert into Note(name,_id) values(?,?)";
Object obj[] = { "这里是你想添加记录的内容", ID };
dbWriter.execSQL(sql, obj);
(3)删除某一条记录。提供要删的记录的_id(这里以num想要删除记录的_id为例),将它删除同时将其后记录的_id均减1:
dbReader.delete("Note", "_id = ?", new String[] { ""+num});
Cursor cursor = dbReader.query("Note", null, null, null, null,
null, null);
if (cursor.moveToFirst()) {
do {
int ID = cursor.getInt(cursor.getColumnIndex("_id"));
if (ID > num) {
ID--;
ContentValues values = new ContentValues();
values.put("_id", ID);
dbReader.update("Note", values, "_id=?",
new String[] { ID + 1 + "" });
}
} while (cursor.moveToNext());
}
这样id不可改的问题就通过添加了一个可改的_id解决了