我有一个像这样的SQLite数据库:
private static final String CREATE_BDD =
"CREATE TABLE " + TABLE_NOTE + " ("
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_TITLE + " TEXT NOT NULL, "
+ COL_NOTE + " TEXT NOT NULL, "
+ COL_COLOR + " TEXT NOT NULL);";
数据库存储了我可以通过 ID 识别的笔记。当我从数据库中删除注释时,我希望所有 ID 都优于已删除注释的 ID 递减 1,然后我可以保留像"1、2、3、4"这样的列 ID 而不是"1、3、4"当我删除 ID 为 2 的笔记时。
因为我使用它来阅读我所有的笔记(使用 BDDManager 我的 DAO),并且我不想使用列表来获取所有笔记:
private void readAllNotes(){
int i = 1;
Note note = new Note();
BDDManager.open();
do{
note = BDDManager.getNoteWithId(i);
if(note != null){
addCard(note); //here I add the note to a new TextView
i++;
}
}while(note != null);
BDDManager.close();
}
当我删除笔记时,我在删除的 ID 后无法读取,因为它返回 null 并在删除笔记后停止阅读笔记
以下是我删除注释的方法:
public int removeNoteWithId(int id){
return bdd.delete(TABLE_NOTE, COL_ID + " = " +id, null);
}
首先,当做这样的事情时,我的第一直觉是你应该锁定桌子。其次,你可以使用你的 DAO 循环遍历所有的笔记,让每个笔记自己更新(或者调用 DAO)。
public int removeNoteWithId(int id){
for(Note n : notes)
{
n.decrementID();//OR decrement(n.getID);
}
return bdd.delete(TABLE_NOTE, COL_ID + " = " +id, null);
}
此外,与其一直更改 id,不如考虑为位置排序增加一个列。这样,您可以使用 id 来确保唯一性和索引,并使用另一列进行排序。
主键一旦创建,可能无法更改。为什么你不尝试使用 从TABLE_NOTE中选择 * ?获得结果后,根据您的逻辑调用添加卡(注意)。
很长,晚上在这里(法国)
最后我确实像豆5说的那样。我是一个菜鸟:p我只是在搜索"自动"的东西,也许是为了避免数据库中的一些I/O
private void updateAllId(int id){
Note note = new Note();
do{
note = getNoteWithId(id+1);
if(note != null){
note.setId(id);
updateNoteId(id++, note);
}
}while(note != null);
}
public int updateNoteId(int id, Note note){
ContentValues values = new ContentValues();
values.put(COL_ID, note.getId());
return bdd.update(TABLE_NOTE, values, COL_ID + " = " +id, null);
}
谢谢大家 !问题已解决