非常简单的问题,但我仍然没有在互联网上找到我的答案: 基本上我刚刚创建了一个新行并将其插入到数据库中,但我想保存该行新创建的主键。我该如何访问它? 就目前而言,我试图使用列的其余值来查找某一行,但我得到的是SQLiteException:bind或column index超出范围。
以下是我当前函数尝试获取keyid的代码:
public String getPrimaryKey(String gameTitle, String gameType, String calories, String hours, String minutes) {
Cursor cursor = db.query(TABLE_NAME, null, null,new String[]{gameTitle, gameType,calories, hours, minutes},null, null,null,null);
if(cursor.getCount()<1)
{
cursor.close();
return "????";
}
cursor.moveToFirst();
String keyid = cursor.getString(cursor.getColumnIndex(KEY_ID));
cursor.close();
return keyid;
}
参数中传递的字符串是我尝试用来访问主键的其他列。
非常感谢!
答案 0 :(得分:1)
ANDROID SQLITE:如何检索某行的主键
你是如何实际做到的:
if (cursor.moveToFirst()) {
int _id = cursor.getInt(cursor.getColumnIndex(KEY_ID));
}
您需要检查光标是否为空。在您的实际代码中,您正在调用它,但不检查返回的值。
如何获取rowId的另一种方法是,如果您通过内置方法insert()
插入行,则返回新插入行的rowId。
long rowId = db.insert("table", "nullColumnHack", data);
你也传递了选择null,意思是:
传递null将返回给定表的所有行。
然后你传递给selectionArgs五个值与选择中的列数不匹配(你在那里传递null)。他们必须匹配。所以你需要解决它:
答案 1 :(得分:0)
答案here将为您提供获取最后一个插入ID所需的内容。
不幸的是,根据http://www.sqlite.org/c3ref/last_insert_rowid.html:
如果一个单独的线程在同一个数据库连接上执行新的INSERT,而sqlite3_last_insert_rowid()函数正在运行,从而更改了最后一个insert rowid,那么sqlite3_last_insert_rowid()返回的值是不可预测的,可能不等于旧的或新的最后一个插入rowid。
因此,抓取最后一行ID很容易出现并发问题。
您可能需要考虑自己生成主键,而不是自动生成主键。
或者,如果有一些其他字段/字段可以搜索唯一标识该行的字段,则可以根据该字段进行选择 - 但是,在这种情况下,那些其他字段应该真正是实际的主键