Android 在SQLite中使用VACUUM实现手动编码的自动递增RowId/d

Android 在SQLite中使用VACUUM实现手动编码的自动递增RowId/d,android,sql,sqlite,Android,Sql,Sqlite,我遇到了一个永恒的问题,那就是希望在删除记录后保持不变的自动递增列(在SQLITE中)。关于这个问题,我已经读过很多文章,但没有一篇文章确切地解释了如何为自己的专栏编写代码。我需要这些数字是连续的,因为我希望能够在ListView中显示每个项目的记录编号,这也将作为数据库中记录数的运行总数 到目前为止,我一直在尝试使用VACUUM函数,因为据我所知,它将在完成后重置数字,并且我认为每次删除记录时都会运行它,但运行代码时似乎什么都没有发生。我没有得到任何错误,但真空没有发生,因为我可以告诉。代码如

我遇到了一个永恒的问题,那就是希望在删除记录后保持不变的自动递增列(在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方法一次,它就应该执行该命令。