插入后获取生成的ID


138

我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。

我认为一种解决方案可以在包含之后进行搜索,但它并不是最好的方法。

Answers:


271

insert方法返回id刚插入的行或-1插入期间发生错误的行。

long id = db.insert(...);

db在哪里SQLiteDatabase


21
我读了规格。“返回:新插入的行的行ID;如果发生错误,则返回-1”。rowId与我生成的字段“ id主键自动递增”相同吗?
Marcos Vasconcelos

29
是的,是一样的。
GrAnd11年

3
@GrAnd,但是如果我要删除表中的一些“中间开始”行,那么我会破坏生成的id = n的第n行的顺序。返回的行ID是否与生成的自动增量ID相同?
UnknownJoe 2014年

1
如果您需要执行INSERT或UPDATE并获取ID怎么办?
蒂莫,2016年

1
@UnknownJoe我知道这是旧帖子。但是可能对某人有帮助。即使从中间删除行ID和自动递增的ID也将相同。
Raj Kannan Iyyappan '18

8

如果使用ContentValues:

 DBHelper db =new DBHelper();// your dbHelper
 ContentValues values = new ContentValues();
  values.put("firstName","Ahmad");
 values.put("lastName","Aghazadeh");
 long insertedId= db.getSQLiteDatabase().insert("user", "", values) ;

如果查询执行使用 select last_insert_rowid()

String sql = "INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";
 DBHelper itemType =new DBHelper();// your dbHelper
 c = db.rawQuery(sql, null);
 if (c.moveToFirst())
    result = c.getLong(0);

如果使用房间

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}


@Dao
public interface UserDao{
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(User user);

    // Insert multiple users
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long[] insert(User... user);
}

5

我检查了来源。 insert方法使用sqlite3_last_insert_rowid函数返回ID。根据文档:https : //www.sqlite.org/c3ref/last_insert_rowid.html 行ID是隐藏列或INTEGER PRIMARY KEY声明的类型的列。

大多数SQLite表(表除外WITHOUT ROWID)中的每个条目都有一个唯一的称为“ rowid ”的64位带符号整数。只要未显式声明的列也未使用行名,ROWID始终可作为未声明的列ROWID,OID或_ROWID_使用。如果表具有类型的列,则该列是rowid的另一个别名INTEGER PRIMARY KEY

所以这_ID通常是默认列


1

我在mySQL上遇到了很多问题,LAST_INSERT_ID不是获取ID的可靠方法,如果您有用户在锤击数据库,返回的ID可能不是您运行的查询所插入的ID,其他用户可能会影响此ID的返回。我们的服务器平均每分钟要攻击7000个用户,并且总是绊倒。

我们的解决方案是使用您插入的查询中的数据,然后使用该数据搜索该结果。无论如何,您正在执行请求以查找最后一个ID。因此,您最好执行SELECT id FROM表,其中field = var和field = var以获得ID。它对查询的性能影响不大,但返回的结果却可靠得多。


3
这要求您每行的列值必须是唯一的(或大多数情况下是唯一的),否则可能会返回多个ID。
理查德·巴克

0

只需使用即可获取最后插入的行_id last_insert_rowid()。示例代码如下。

/**
 * Return Last inserted row id(auto incremented row) (_id)
 * @return
 */
public int getLastAddedRowId() {
    String queryLastRowInserted = "select last_insert_rowid()";

    final Cursor cursor = database.rawQuery(queryLastRowInserted, null);
    int _idLastInsertedRow = 0;
    if (cursor != null) {
        try {
            if (cursor.moveToFirst()) {
                _idLastInsertedRow = cursor.getInt(0);
            }
        } finally {
            cursor.close();
        }
    }

    return _idLastInsertedRow;

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.