我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。
我认为一种解决方案可以在包含之后进行搜索,但它并不是最好的方法。
我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。
我认为一种解决方案可以在包含之后进行搜索,但它并不是最好的方法。
Answers:
如果使用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);
}
我检查了来源。
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
通常是默认列
我在mySQL上遇到了很多问题,LAST_INSERT_ID不是获取ID的可靠方法,如果您有用户在锤击数据库,返回的ID可能不是您运行的查询所插入的ID,其他用户可能会影响此ID的返回。我们的服务器平均每分钟要攻击7000个用户,并且总是绊倒。
我们的解决方案是使用您插入的查询中的数据,然后使用该数据搜索该结果。无论如何,您正在执行请求以查找最后一个ID。因此,您最好执行SELECT id FROM表,其中field = var和field = var以获得ID。它对查询的性能影响不大,但返回的结果却可靠得多。
只需使用即可获取最后插入的行_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;
}