2011-03-23 111 views
122

我正在使用Android的SQLite,並且我想知道獲取插入的行的生成ID的最佳方式。插入後獲取生成的ID

我認爲在包含之後進行搜索的解決方案,但它看起來不是最好的方法。

回答

236

insert方法返回行的id剛插入或-1,如果有插入過程中出現錯誤。

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

其中db是SQLiteDatabase

+16

我在規格上閱讀。 「返回:新插入的行的行ID,如果發生錯誤,則返回-1」rowId與我生成的字段「id主鍵autoincrement」相同? – 2011-03-23 18:28:42

+24

是的,它是一樣的。 – GrAnd 2011-03-23 18:33:25

+5

謝謝!經過測試和批准。 – 2011-03-23 18:35:38

3

我檢查了來源。 insert方法使用sqlite3_last_insert_rowid函數返回一個id。 根據文檔:https://www.sqlite.org/c3ref/last_insert_rowid.html 行標識是隱藏列或類型爲INTEGER PRIMARY KEY的列(如果已聲明)。

所以這是默認_ID柱通常

1

我有相當多的與此有關MySQL的問題,LAST_INSERT_ID是不可靠的方式來獲得ID,如果有用戶錘擊數據庫時,ID返回可能不是您運行的查詢插入的ID,其他幾個用戶可能會影響此ID的返回。我們的服務器平均每分鐘有7000個用戶在捶打,而且它總是絆倒。

我們的解決方案是使用您插入的查詢中的數據,然後使用該數據搜索該結果。無論如何,你正在做一個尋找最後一個ID的請求。所以你不妨做一個SELECT ID FROM表,其中field = var和field = var來獲得id。它在查詢中性能稍差,但返回的結果更加可靠。

+2

中有詳細記錄這要求每行的列值是唯一的(或者大多數是唯一的),否則會有返回多個ID的風險。 – 2016-06-20 01:18:00

3

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

如果查詢EXEC使用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); 
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; 

}