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 が 1 つ減るため、列 ID を「1、3、4」よりも「1、2、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);
}
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 に答える