Android 在SQLite中使用VACUUM实现手动编码的自动递增RowId/d
我遇到了一个永恒的问题,那就是希望在删除记录后保持不变的自动递增列(在SQLITE中)。关于这个问题,我已经读过很多文章,但没有一篇文章确切地解释了如何为自己的专栏编写代码。我需要这些数字是连续的,因为我希望能够在ListView中显示每个项目的记录编号,这也将作为数据库中记录数的运行总数 到目前为止,我一直在尝试使用VACUUM函数,因为据我所知,它将在完成后重置数字,并且我认为每次删除记录时都会运行它,但运行代码时似乎什么都没有发生。我没有得到任何错误,但真空没有发生,因为我可以告诉。代码如下:Android 在SQLite中使用VACUUM实现手动编码的自动递增RowId/d,android,sql,sqlite,Android,Sql,Sqlite,我遇到了一个永恒的问题,那就是希望在删除记录后保持不变的自动递增列(在SQLITE中)。关于这个问题,我已经读过很多文章,但没有一篇文章确切地解释了如何为自己的专栏编写代码。我需要这些数字是连续的,因为我希望能够在ListView中显示每个项目的记录编号,这也将作为数据库中记录数的运行总数 到目前为止,我一直在尝试使用VACUUM函数,因为据我所知,它将在完成后重置数字,并且我认为每次删除记录时都会运行它,但运行代码时似乎什么都没有发生。我没有得到任何错误,但真空没有发生,因为我可以告诉。代码如
String sql = "VACUUM;" ;
db.execSQL(sql,new String [] {sql});
populateListViewFromDB();
}
@SuppressWarnings("deprecation")
private void populateListViewFromDB() {
Cursor cursor = db.getAllRecords();
//Allow activity to manage cursor lifetime
startManagingCursor(cursor);
//Setup mapping from cursor to view fields:
String [] fromFieldNames = new String []
{DBAdapter.KEY_ROWID, DBAdapter.KEY_GENRE, DBAdapter.KEY_TITLE, DBAdapter.KEY_PLATFORM, DBAdapter.KEY_DATE, DBAdapter.KEY_PRICE, DBAdapter.KEY_WHEREBOUGHT};
int [] toViewIDs = new int []
{R.id.RecordNumberEdit, R.id.textView1, R.id.textView2, R.id.textView3, R.id.textView4, R.id.textView5, R.id.textView6};
//Create mapping from cursor to view fields
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.database_view_layout,
cursor, //Set of DB records
fromFieldNames, //DB field Names
toViewIDs //View IDs in which to put info
);
//Set the adapter for the list view
ListView listViewFromDB = (ListView) findViewById(R.id. listViewFromDB);
listViewFromDB.setAdapter(myCursorAdapter);
也许什么都没有发生,因为编码关闭了?所以我想我在这里得到的是,我是在正确的轨道上尝试使用真空,还是应该手动设置一个自动递增列?无论哪种方式,任何建议都将不胜感激
下面是代码的获取和显示部分:
String sql = "VACUUM;" ;
db.execSQL(sql,new String [] {sql});
populateListViewFromDB();
}
@SuppressWarnings("deprecation")
private void populateListViewFromDB() {
Cursor cursor = db.getAllRecords();
//Allow activity to manage cursor lifetime
startManagingCursor(cursor);
//Setup mapping from cursor to view fields:
String [] fromFieldNames = new String []
{DBAdapter.KEY_ROWID, DBAdapter.KEY_GENRE, DBAdapter.KEY_TITLE, DBAdapter.KEY_PLATFORM, DBAdapter.KEY_DATE, DBAdapter.KEY_PRICE, DBAdapter.KEY_WHEREBOUGHT};
int [] toViewIDs = new int []
{R.id.RecordNumberEdit, R.id.textView1, R.id.textView2, R.id.textView3, R.id.textView4, R.id.textView5, R.id.textView6};
//Create mapping from cursor to view fields
SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.database_view_layout,
cursor, //Set of DB records
fromFieldNames, //DB field Names
toViewIDs //View IDs in which to put info
);
//Set the adapter for the list view
ListView listViewFromDB = (ListView) findViewById(R.id. listViewFromDB);
listViewFromDB.setAdapter(myCursorAdapter);
我将VACCUUM代码更改为以下代码,因为原始代码实际上传递了两次查询:
String sql = "VACUUM;" ;
db.execSQL(sql);
尽管如此,似乎什么也没有发生 嗯,两次传递相同的命令(
sql
)可能不是正确的方法。您是否查阅了该特定方法的文档?能否发布获取和显示数据的代码?我已经阅读了以下页面:。我还检查了这个:但我不确定我是否掌握了如何正确实施它的要点。不过,看起来应该很简单。你提到我在两次中传递了这个命令……那么我如何修改代码使其只执行一次呢?根据Ketan的请求,用额外的代码更新帖子;只需将命令传递给execSQL方法一次,它就应该执行该命令。