0

我有一个这样的 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,然后我可以将列 ID 保持为“1、2、3、4”而不是“1、3、4”当我删除 ID 为 2 的便笺时。

因为我用它来阅读我的所有笔记(使用 BDDManager 我的 DAO)并且我不想使用 List 来获取所有笔记:

    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);
}
4

3 回答 3

2

首先,当做这样的事情时,我的第一直觉是你应该锁定桌子。其次,您可以使用您的 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 来确保唯一性和索引,并使用另一列进行排序。

于 2013-10-13T00:29:45.947 回答
1

主键创建后可能无法更改。你为什么不尝试使用SELECT * FROM TABLE_NOTE; ? 根据您的逻辑获得结果调用 addcard(note) 后。

于 2013-10-13T00:41:11.103 回答
0

抱歉,回复太长了,晚上在这里(法国)

最后我确实像bean5说的那样。而且我是菜鸟: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);

}

谢谢大家!问题解决了

于 2013-10-13T03:52:01.313 回答