Android 房间 - 清理 sqlite_sequence 无效
Android room - clearing sqlite_sequence is not working
下面的代码不是resetting/clearing自动递增id到0
database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
.build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"});
或
database.query("REPLACE INTO sqlite_sequence (name, seq) VALUES ('mission', -1)", null);
Android 房间里的 sqlite_sequence
有什么可以清除的吗?
Android 房间没有使用 "sqlite_sequence" 作为自动递增逻辑我想,不确定。尝试打印 sqlite_sequence
条目,找不到我使用的 table 名称(具有自动递增主键)。
当使用AUTOINCREMENT
时,确定rowid的算法,因此当sqlite_sequence是created/used,使用最高的现有 rowid 或 sqlite_sequence table 中的值(seq 列)中的较高者。
因此,如果关联的 table 中存在任何行,那么设置 seq 列将无效,前提是它不是大于最高 rowid 的值关联的 table.
如果 table 没有行,那么我相信删除 table 将导致 sqlite_sequence table 中的相应行被自动删除。
试试这个代码对我有用
class FeedReaderDbHelper extends SQLiteOpenHelper {
static final int DATABASE_VERSION = 1;
static final String DATABASE_NAME = DBConfig.DATABASE_NAME;
FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(mainContext.getApplicationContext());
mDbHelper.getWritableDatabase().execSQL("DELETE FROM sqlite_sequence WHERE name='table_name';");
我把这个函数放在我的 RoomDatabase class:
companion object {
fun resetPointer(nonRoomDb: MyRoomDatabase){
nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")
}
}
所以你可以在代码中的任何地方调用它:
val database = MyRoomDatabase.getInstance(application)
MyRoomDatabase.resetPointer(database)
下面的代码不是resetting/clearing自动递增id到0
database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
.build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"});
或
database.query("REPLACE INTO sqlite_sequence (name, seq) VALUES ('mission', -1)", null);
Android 房间里的 sqlite_sequence
有什么可以清除的吗?
Android 房间没有使用 "sqlite_sequence" 作为自动递增逻辑我想,不确定。尝试打印 sqlite_sequence
条目,找不到我使用的 table 名称(具有自动递增主键)。
当使用AUTOINCREMENT
时,确定rowid的算法,因此当sqlite_sequence是created/used,使用最高的现有 rowid 或 sqlite_sequence table 中的值(seq 列)中的较高者。
因此,如果关联的 table 中存在任何行,那么设置 seq 列将无效,前提是它不是大于最高 rowid 的值关联的 table.
如果 table 没有行,那么我相信删除 table 将导致 sqlite_sequence table 中的相应行被自动删除。
试试这个代码对我有用
class FeedReaderDbHelper extends SQLiteOpenHelper {
static final int DATABASE_VERSION = 1;
static final String DATABASE_NAME = DBConfig.DATABASE_NAME;
FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(mainContext.getApplicationContext());
mDbHelper.getWritableDatabase().execSQL("DELETE FROM sqlite_sequence WHERE name='table_name';");
我把这个函数放在我的 RoomDatabase class:
companion object {
fun resetPointer(nonRoomDb: MyRoomDatabase){
nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")
}
}
所以你可以在代码中的任何地方调用它:
val database = MyRoomDatabase.getInstance(application)
MyRoomDatabase.resetPointer(database)