2011-03-23 113 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; 

}