获取SQLite数据库的下一个AUTO_INCREMENT值

Bri*_*ian 10 sqlite android auto-increment

使用Android API中的典型SQLiteDatabase对象,如何在不影响值本身的情况下获取AUTO_INCREMENT特定列的下一个值(即.id).有没有办法呢?或者我应该执行什么查询来获得该结果.请记住,SQLiteDatabase.query()返回一个Cursor对象,所以如果我只是想从中获取一个值,我不太确定如何直接处理它.

aha*_*aha 14

你是对的.第一个答案(仍在下面)仅适用于没有AUTOINCREMENT的id.使用AUTOINCREMENT时,值将存储在单独的表中并用于增量.以下是查找值的示例:

public void printAutoIncrements(){
    String query = "SELECT * FROM SQLITE_SEQUENCE";
    Cursor cursor = mDb.rawQuery(query, null);
    if (cursor.moveToFirst()){
        do{
            System.out.println("tableName: " +cursor.getString(cursor.getColumnIndex("name")));
            System.out.println("autoInc: " + cursor.getString(cursor.getColumnIndex("seq")));

        }while (cursor.moveToNext());
    }

    cursor.close(); 

}
Run Code Online (Sandbox Code Playgroud)

请参阅:http://www.sqlite.org/autoinc.html

第一个答案:

您可以查询_id列的最大值,例如:

String query = "SELECT MAX(id) AS max_id FROM mytable";
Cursor cursor = db.rawQuery(query, null);

int id = 0;     
if (cursor.moveToFirst())
{
    do
    {           
        id = cursor.getInt(0);                  
    } while(cursor.moveToNext());           
}
return id;
Run Code Online (Sandbox Code Playgroud)

这适用于尚未指定为"INTEGER PRIMARY KEY AUTOINCREMENT"的行ID(所有表都有行id列).

  • 每次@hanry cursor.getCount()很可能是错误的方法:任何时候从表中删除一行.对于没有自动增量行id的表,默认行id从最大值开始递增. (2认同)

ElY*_*nte 5

关于SQLITE_SEQUENCE表的一个重要说明.

文件说

每当创建包含AUTOINCREMENT列的普通表时,都会自动创建并初始化SQLITE_SEQUENCE表.

因此,创建了SQLITE_SEQUENCE表,但不是与包含AUTOINCREMENT列的表关联的行.使用第一个插入查询创建该行("seq"值为1).

这意味着在查找特定表的下一个自动增量值之前,必须至少执行一次插入操作.例如,可以在创建表之后,执行插入和删除虚拟行来完成.


小智 5

这是使用SQLITE在自动增量PRIMARY KEY上获取最后一个ID的最佳方法

String query = "select seq from sqlite_sequence WHERE name = 'Table_Name'"