27

我正在尝试从 Android 中的 sqlite 数据库中获取最后插入的 rowid。我已经阅读了很多关于它的帖子,但无法让一个工作。这是我的方法:

 public Cursor getLastId() {
        return mDb.query(DATABASE_TABLE, new String[] {KEY_WID}, KEY_WID + "=" + MAX(_id), null, null, null, null, null);}

我试过 MAX,但我一定是用错了。还有其他方法吗?

4

10 回答 10

66

实际上,SQLiteDatabase 类有它自己的 insert 方法,它返回新创建行的 id。我认为这是获得新 ID 的最佳方式。您可以在此处查看其文档。

我希望这有帮助。

于 2011-06-08T01:35:06.100 回答
27

利用

 SELECT last_insert_rowid();

获取最后插入的rowid。如果您使用的是AUTOINCREMENT关键字,那么

SELECT * from SQLITE_SEQUENCE;

会告诉你每个表的值。

于 2010-10-25T20:30:35.507 回答
15

从表中获取最后一行..

Cursor cursor = theDatabase.query(DATABASE_TABLE, columns,null, null, null, null, null);
cursor.moveToLast();
于 2012-06-29T15:50:45.200 回答
2

如果您想要 last_insert_id 只是在插入之后,您可以使用它:

public long insert(String table, String[] fields, String[] vals ) 
{
    String nullColumnHack = null;
    ContentValues values = new ContentValues();
    for (int i = 0; i < fields.length; i++) 
    {
        values.put(fields[i], vals[i]); 
    }

    return myDataBase.insert(table, nullColumnHack, values);
}
于 2012-03-29T14:18:26.370 回答
2

moveToLast()Cursor界面中使用。

来自android.googlesource.com

/**
 * Move the cursor to the last row.
 *
 * <p>This method will return false if the cursor is empty.
 *
 * @return whether the move succeeded.
 */
boolean moveToLast();

简单的例子:

final static String TABLE_NAME = "table_name";
String name;
int id;
//....

Cursor cursor = db.rawQuery("SELECT  * FROM " + TABLE_NAME, null);

if(cursor.moveToLast()){
    //name = cursor.getString(column_index);//to get other values
    id = cursor.getInt(0);//to get id, 0 is the column index
}

或者您可以在插入时获得最后一行(@GorgiRankovski 提到过):

long row = 0;//to get last row
//.....
SQLiteDatabase db= this.getWritableDatabase();

ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME, name);

row = db.insert(TABLE_NAME, null, contentValues);
//insert() returns the row ID of the newly inserted row, or -1 if an error occurred 

他们还有多种方法可以使用查询来做到这一点:

  1. 一个由@DiegoTorresMilano 表示
  2. SELECT MAX(id) FROM table_name. 或获取所有列的值SELECT * FROM table_name WHERE id = (SELECT MAX(id) FROM table_name)
  3. 如果您PRiMARY KEY已经坐到AUTOINCREMENT,您可以SELECT使用 max 到 min 并限制行数为 1 SELECT id FROM table ORDER BY column DESC LIMIT 1 (如果您想要每个值,请使用*而不是id
于 2017-07-16T17:34:18.777 回答
2

insert 方法返回刚刚插入的行的 id,如果在插入过程中出错,则返回 -1。

long id = db.insert("your insertion statement");

db 是您的 SQLiteDatabase 的一个实例。

于 2017-02-26T06:21:33.477 回答
1
/**
 * @return
 */
public long getLastInsertId() {
    long index = 0;
    SQLiteDatabase sdb = getReadableDatabase();
    Cursor cursor = sdb.query(
            "sqlite_sequence",
            new String[]{"seq"},
            "name = ?",
            new String[]{TABLENAME},
            null,
            null,
            null,
            null
    );
    if (cursor.moveToFirst()) {
        index = cursor.getLong(cursor.getColumnIndex("seq"));
    }
    cursor.close();
    return index;
}
于 2011-11-11T06:02:06.100 回答
1

尝试这个:

public Cursor getLastId() {
        return mDb.query(DATABASE_TABLE, new String[] { **MAX(id)** }, null, null, null, null, null, null);}
于 2011-06-07T08:58:37.247 回答
0

在您的 DbHelper 类中,

    public long getLastIdFromMyTable()
    {
        SQLiteDatabase db = this.getReadableDatabase();
        SQLiteStatement st = db.compileStatement("SELECT last_insert_rowid() from " + MY_TABLE);
        return st.simpleQueryForLong();
    }
于 2021-01-08T09:53:53.057 回答
0

我用这个

public int lastId(){
    SQLiteDatabase db =  
  this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select * from resep", null );
    res.moveToLast();
    return res.getInt(0);
}
于 2020-07-19T12:36:23.930 回答