[英]Android Studio Sqllite autoincrement reset
db.execSQL("CREATE TABLE " +DBTable0+ "("+ROW2+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ROW3+" VARCHAR NOT NULL, "+ROW0+" TEXT NOT NULL, "+ROW1+" VARCHAR NOT NULL)");
這是我的數據庫的創建表命令。
我想重置 ROW2 的值。
例如,我在這張表上有 5 條記錄。
1,save1,這是一個Save1,11.25
2、save2,這是一個Save2,23.48
3、save3,這是一個Save3,09.45
4、save4,這是一個Save4,11.55
5,save5,這是一個Save5,21.00
我想刪除save2。 當我刪除它或其他刪除時,我想重置 ROW2 索引,所以
1,save1,這是一個Save1,11.25
2、save3,這是一個Save3,09.45
3、save4,這是一個Save4,11.55
4、save5,這是一個Save5,21.00
像這樣 ...
我該怎么做。?
AUTOINCREMENT
關鍵字的重點是永遠不要重復使用 rowid。 它存儲為表分配的最高值,並且在插入沒有在 insert 語句中明確給出的 rowid 的新行時,選擇一個比存儲的數字大的數字。 如果沒有AUTOINCREMENT
,它只會選擇一個高於表中當前最大 rowid 的數字(如果最大值是最大可能的有符號 64 位整數,它會隨機選擇一些較小的數字,希望在放棄之前缺少一個)。
如果要回收 rowid 編號,則必須手動查找丟失的編號並在UPDATE
語句中顯式使用它們,或者沒有INTEGER PRIMARY KEY
列,並在刪除行后運行VACUUM
。 如果沒有INTEGER PRIMARY KEY
列作為 rowid 的別名,在這種情況下,sqlite 將重新排列它們。 或者,您可以將表的行(減去INTEGER PRIMARY KEY
列)復制到新表中以獲取新的 rowid。 所有這些都是非常低效的方法,也是不可取的。 忍受已刪除行的間隙。
必須閱讀以了解 rowid、 INTEGER PRIMARY KEY
列和AUTOINCREMENT
:
https://www.sqlite.org/rowidtable.html
https://www.sqlite.org/lang_createtable.html#rowid
https://www.sqlite.org/autoinc.html
我將通過 ListViews 選擇記錄。 然后我可以刪除和更新我選擇的項目的記錄。 所以當我刪除中間的任何記錄時。 id 正在混合並刪除錯誤記錄
聽起來您假設某物的位置列表與行的 rowid 相同? 難怪你有問題。 明確跟蹤 rowid 並在刪除請求的數據時使用它。 XY 問題的經典案例。
要在使用 AUTOINCREMENT 時重置分配以補償已刪除行的rowid ,您必須進行兩項更改:-
這一點都不可取,而且會大大增加使用 AUTOINCREMENT 的低效率(當您很有可能不需要使用 AUTOINCREMENT 時)。
AUTOINCREMENT 關鍵字會增加額外的 CPU、內存、磁盤空間和磁盤 I/O 開銷,如果不是絕對需要,應該避免使用。 通常不需要。
事實上,不建議依賴於除了 SQLite 分配的rowid
的任何東西
<column_name> INTEGER PRIMARY KEY
(有或沒有 AUTOINCREMENT)使 <column_name> 和rowid 的別名)。###你說 :-
我想重置 ROW2 的值。
我建議重新評估您的願望,以便僅在實際上有需要時才想要這個,而這在所有可能的情況下都沒有。
###你然后說
我將通過 ListViews 選擇記錄。 然后我可以刪除和更新我選擇的項目的記錄。 所以當我刪除中間的任何記錄時。 id 正在混合並刪除錯誤記錄
如果您使用 CursorAdapter,例如 SimpleCursorAdapter,則 onItemClick 和 onItemLongClick 的第四個參數是id 。
請注意,要使用 CursorAdapter,在作為 ListView 源的 Cursor 中必須存在名為_id的列,並且該列應包含rowid 。 您可以使用BaseColumns._ID ,它是一個值為_id的常量。
通常,您將表中的列定義為_id INTEGER PRIMARY KEY
或者,您可以使用rowid AS _id, *
在這種情況下,列_id將附加到所有其他列。
可以在此處找到其他適配器的此選項/說明
##工作示例
但是,如果您堅持,那么下面的示例可以滿足您的要求。
請注意,此示例對 2 個表執行相同(有效)的操作。
主要代碼在數據庫助手(SQLiteOpenHelper 的子類)中,即DBHelper.java :-
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String TBL_TABLE1 = "table1";
public static final String TBL_TABLE2 = "table2";
public static final String COL_TABLE_COL1 = "col1";
public static final String COL_TABLE_COL2 = "col2";
public static final String COL_TABLE_COL3 = "col3";
private static final String crt_table1_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE1 + "(" +
COL_TABLE_COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COL_TABLE_COL2 + " TEXT NOT NULL," +
COL_TABLE_COL3 + " TEXT NOT NULL" +
")";
private static final String crt_table2_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE2 + "(" +
COL_TABLE_COL1 + " INTEGER PRIMARY KEY," +
COL_TABLE_COL2 + " TEXT NOT NULL," +
COL_TABLE_COL3 + " TEXT NOT NULL" +
")";
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.disableWriteAheadLogging();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(crt_table1_sql);
db.execSQL(crt_table2_sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public void insert(String col2, String col3) {
ContentValues cv = new ContentValues();
cv.put(COL_TABLE_COL2,col2);
cv.put(COL_TABLE_COL3,col3);
mDB.beginTransaction();
mDB.insert(TBL_TABLE1,null,cv);
mDB.insert(TBL_TABLE2,null,cv);
mDB.setTransactionSuccessful();
mDB.endTransaction();
}
public void deleteByValues(String col2, String col3) {
String whereclause = COL_TABLE_COL2 + "=? AND " + COL_TABLE_COL3 + "=?";
String[] args = new String[]{col2,col3};
mDB.beginTransaction();
mDB.delete(TBL_TABLE1,whereclause,args);
mDB.delete(TBL_TABLE2,whereclause,args);
rationaliseCol1Values();
mDB.setTransactionSuccessful();
mDB.endTransaction();
}
private void rationaliseCol1Values() {
ContentValues cv = new ContentValues();
Cursor csr = mDB.query(TBL_TABLE1,null,null,null,null,null,COL_TABLE_COL1 + " ASC");
int rowcount = csr.getCount();
long expected_id = 1;
long current_id;
String where_clause = COL_TABLE_COL1 + "=?";
String[] args = new String[1];
while (csr.moveToNext()) {
current_id = csr.getLong(csr.getColumnIndex(COL_TABLE_COL1));
if (current_id != expected_id) {
cv.clear();
cv.put(COL_TABLE_COL1,expected_id);
args[0] = String.valueOf(current_id);
mDB.update(TBL_TABLE1,cv,where_clause,args);
mDB.update(TBL_TABLE2,cv,where_clause,args);
}
expected_id++;
}
csr.close();
// Now adjust sqlite_sequence
where_clause = "name=?";
args[0] = TBL_TABLE1;
cv.clear();
cv.put("seq",String.valueOf(rowcount));
mDB.update("sqlite_sequence",cv,where_clause,args);
}
public void logTableRows(int stage) {
String tablenamne_column = "tablename";
Cursor[] csr = new Cursor[] {
mDB.query(TBL_TABLE1,new String[]{"'table1' AS " + tablenamne_column + ",*"},null,null,null,null,null),
mDB.query(TBL_TABLE2,new String[]{"'table2' AS " + tablenamne_column + ",*"}, null,null,null,null,null)
};
MergeCursor csr3 = new MergeCursor(csr);
StringBuilder sb = new StringBuilder("Data in both tables consists of " + String.valueOf(csr3.getCount()) + " rows :-");
while (csr3.moveToNext()) {
sb.append(
"\n\tTableName = " + csr3.getString(csr3.getColumnIndex(tablenamne_column)
)
).append(" " + COL_TABLE_COL1 + " value is " + csr3.getString(csr3.getColumnIndex(COL_TABLE_COL1))
).append(" " + COL_TABLE_COL2 + " value is " + csr3.getString(csr3.getColumnIndex(COL_TABLE_COL2))
).append(" " + COL_TABLE_COL3 + " value is" + csr3.getString(csr3.getColumnIndex(COL_TABLE_COL3))
);
}
Log.d("DATA4STAGE" + String.valueOf(stage),sb.toString());
}
}
用於測試上述的調用活動是:-
public class MainActivity extends AppCompatActivity {
DBHelper mDBHlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBHlpr = new DBHelper(this);
manipulateSomeData();
}
private void manipulateSomeData() {
mDBHlpr.logTableRows(0);
mDBHlpr.insert("TEST001","TESTING001");
mDBHlpr.insert("TEST002","TESTING001");
mDBHlpr.insert("TEST003","TESTING001");
mDBHlpr.insert("TEST004","TESTING001");
mDBHlpr.insert("TEST005","TESTING001");
mDBHlpr.insert("TEST006","TESTING001");
mDBHlpr.insert("TEST007","TESTING001");
mDBHlpr.insert("TEST008","TESTING001");
mDBHlpr.insert("TEST009","TESTING001");
mDBHlpr.logTableRows(1);
mDBHlpr.deleteByValues("TEST005","TESTING001");
mDBHlpr.logTableRows(2);
mDBHlpr.deleteByValues("TEST008","TESTING001");
mDBHlpr.logTableRows(3);
mDBHlpr.deleteByValues("TEST003","TESTIN001");
mDBHlpr.logTableRows(4);
}
}
結果輸出到日志是:-
2018-12-31 12:43:21.618 2269-2269/so53976714.so53976714 D/DATA4STAGE0: Data in both tables consists of 0 rows :-
2018-12-31 12:43:21.657 2269-2269/so53976714.so53976714 D/DATA4STAGE1: Data in both tables consists of 18 rows :-
TableName = table1 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table1 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table1 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table1 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table1 col1 value is 5 col2 value is TEST005 col3 value isTESTING001
TableName = table1 col1 value is 6 col2 value is TEST006 col3 value isTESTING001
TableName = table1 col1 value is 7 col2 value is TEST007 col3 value isTESTING001
TableName = table1 col1 value is 8 col2 value is TEST008 col3 value isTESTING001
TableName = table1 col1 value is 9 col2 value is TEST009 col3 value isTESTING001
TableName = table2 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table2 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table2 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table2 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table2 col1 value is 5 col2 value is TEST005 col3 value isTESTING001
TableName = table2 col1 value is 6 col2 value is TEST006 col3 value isTESTING001
TableName = table2 col1 value is 7 col2 value is TEST007 col3 value isTESTING001
TableName = table2 col1 value is 8 col2 value is TEST008 col3 value isTESTING001
TableName = table2 col1 value is 9 col2 value is TEST009 col3 value isTESTING001
2018-12-31 12:43:21.666 2269-2269/so53976714.so53976714 D/DATA4STAGE2: Data in both tables consists of 16 rows :-
TableName = table1 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table1 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table1 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table1 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table1 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table1 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table1 col1 value is 7 col2 value is TEST008 col3 value isTESTING001
TableName = table1 col1 value is 8 col2 value is TEST009 col3 value isTESTING001
TableName = table2 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table2 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table2 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table2 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table2 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table2 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table2 col1 value is 7 col2 value is TEST008 col3 value isTESTING001
TableName = table2 col1 value is 8 col2 value is TEST009 col3 value isTESTING001
2018-12-31 12:43:21.675 2269-2269/so53976714.so53976714 D/DATA4STAGE3: Data in both tables consists of 14 rows :-
TableName = table1 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table1 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table1 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table1 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table1 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table1 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table1 col1 value is 7 col2 value is TEST009 col3 value isTESTING001
TableName = table2 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table2 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table2 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table2 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table2 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table2 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table2 col1 value is 7 col2 value is TEST009 col3 value isTESTING001
2018-12-31 12:43:21.681 2269-2269/so53976714.so53976714 D/DATA4STAGE4: Data in both tables consists of 14 rows :-
TableName = table1 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table1 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table1 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table1 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table1 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table1 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table1 col1 value is 7 col2 value is TEST009 col3 value isTESTING001
TableName = table2 col1 value is 1 col2 value is TEST001 col3 value isTESTING001
TableName = table2 col1 value is 2 col2 value is TEST002 col3 value isTESTING001
TableName = table2 col1 value is 3 col2 value is TEST003 col3 value isTESTING001
TableName = table2 col1 value is 4 col2 value is TEST004 col3 value isTESTING001
TableName = table2 col1 value is 5 col2 value is TEST006 col3 value isTESTING001
TableName = table2 col1 value is 6 col2 value is TEST007 col3 value isTESTING001
TableName = table2 col1 value is 7 col2 value is TEST009 col3 value isTESTING001
#NOTE 不推薦使用上面的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.