插入后获取生成的ID

时间:2011-03-23 18:16:01

标签: java android sqlite

我正在使用SQLite和Android,我想知道获取我插入的行的生成ID的最佳方法。

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

5 个答案:

答案 0 :(得分:261)

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

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

其中db是SQLiteDatabase

答案 1 :(得分:4)

如果使用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);
}

答案 2 :(得分:3)

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

这是默认的_ID列通常

答案 3 :(得分:1)

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

我们的解决方案是使用您插入的查询中的数据,然后使用该数据搜索该结果。无论如何,你正在寻找寻找最后一个id的请求。所以你不妨做一个SELECT id FROM table,其中field = var和field = var来获取id。它在查询上有轻微的性能影响,但返回的结果更可靠。

答案 4 :(得分:0)

可以使用last_insert_rowid()简单地获取最后插入的行_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;

}