0

Android SQLite データベースを含むアプリに取り組んでいます。このデータベースで行を追加および削除します。行を削除すると、それは ROWID に基づいています。しかし、行を削除してもROWIDが残っていることがわかりました。たとえば、データベースに 3 つの行があり、2 番目の行を削除すると、3 番目の行は 2 に変更されず、3 のままになります。次に、行を追加すると、4 になります。

だから私の質問は、行を削除して新しい行を追加するときにそれを行う方法です。追加された行の数は削除された行と等しくなります。たとえば、最初の行を削除すると、データベースは、2、3、4 ではなく、他の行 1、2、3 の隣に表示されます。

申し訳ありませんが、少し複雑かもしれませんが、意味があることを願っています。

これが私のコードです:

public HotOrNot open() throws SQLException{
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}

public long createEntry(String name, String hotness) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, name);
cv.put(KEY_HOTNESS, hotness);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

public String getData() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";

int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iHotness = c.getColumnIndex(KEY_HOTNESS);

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
    result = result + c.getString(iRow) + " " + c.getString(iName) + " " + c.getString(iHotness) + "\n";
}
return result;
}

public String getName(long l) throws SQLException{
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null);
if(c != null){
    c.moveToFirst();
    String name = c.getString(1);
    return name;
}
return null;
}

public String getHotness(long l) throws SQLException{
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null);
if(c != null){
    c.moveToFirst();
    String hotness = c.getString(2);
    return hotness;
}
return null;
}

public void updateEntry(long lRow, String mName, String mHotness) throws SQLException{
// TODO Auto-generated method stub
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, mName);
cvUpdate.put(KEY_HOTNESS, mHotness);
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + lRow, null);
}

public void deleteEntry(long lRow1) throws SQLException{
// TODO Auto-generated method stub
ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null);
}
}

行ごとに一意であるため、ROWID を使用して実行できないことはわかっています。私はAndroidとSQLiteの初心者なので、この問題を解決する方法をコードで書いてください。

前もって感謝します

4

1 に答える 1

1

SQLite は、特別な SQLITE_SEQUENCE テーブルを使用して、テーブルがこれまでに保持した最大の ROWID を追跡します。

SQLITE_SEQUENCE テーブルを更新できます-

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = <table_name>

nは行 ID - 1

同様の質問。

于 2013-08-19T17:11:07.460 に答える