插入后获取生成的 id

我在 Android 中使用 SQLite,我想知道获得插入的行的生成 id 的最佳方法。

我认为一个解决方案可以在 include 之后进行搜索,但它看起来并不是最好的方式。

83508 次浏览

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

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

其中 db 为 SQLiteDatabase

我查过资料来源。 insert方法使用 sqlite3_last_insert_rowid函数返回 id。 根据文件: https://www.sqlite.org/c3ref/last_insert_rowid.html 行 id 是隐藏列,如果声明它,则为 INTEGER PRIMARY KEY类型的列。

大多数 SQLite 表中的每个条目(WITHOUT ROWID表除外)都有一个称为“ 吵闹”的 独一无二64位有符号整数 钥匙。ROWID 始终作为名为 ROWID、 OID 或 _ ROWID _ 的未声明列可用,只要这些名称不被显式声明的列使用。那么这个列就是 又一个帮派分子的化名

这通常是默认的 _ID

我在 mySQL 中遇到了很多问题,LAST _ INSERT _ ID 不是获取 ID 的可靠方法,如果你有用户敲击数据库,返回的 ID 可能不是你运行的查询插入的 ID,其他几个用户可能会影响这个 ID 的返回。我们的服务器平均每分钟有7000个用户,它总是出错。

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

如果使用内容值:

 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);
}

可以使用 last_insert_rowid()简单地获取最后插入的 row _ id。

/**
* 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;


}