3

很简单的问题,但我仍然没有在互联网上找到答案:基本上我刚刚创建了一个新行并将其插入到数据库中,但我想保存该行新创建的主键。我如何访问它?就目前而言,我正在尝试使用该列的其余值来查找某一行,但我得到了 SQLiteException : bind or column index out of range。

这是我当前尝试获取 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;

    }

在参数中传递的字符串是我试图用来访问主键的其他列。

非常感谢你!

4

2 回答 2

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 )。他们必须匹配。所以你需要修复它:

  • 将列(与 selectionArgs 中的计数相同)添加到选择中
  • 也将 null 传递给 selectionArgs
于 2013-08-09T20:39:21.687 回答
0

这里的答案将为您提供获取最后一个插入 ID 所需的内容。

不幸的是,根据http://www.sqlite.org/c3ref/last_insert_rowid.html

如果在 sqlite3_last_insert_rowid() 函数正在运行时,一个单独的线程在同一数据库连接上执行新的 INSERT 并因此更改了最后一个插入 rowid,则 sqlite3_last_insert_rowid() 返回的值是不可预测的,并且可能不等于旧的或新的 last插入rowid。

因此,抓取最后一行 ID 容易受到并发问题的影响。

您可能需要考虑自己生成主键,而不是自动生成它。

或者,如果您可以搜索一些其他字段/字段来唯一标识该行,则可以基于该字段进行选择——但是,在这种情况下,那些其他字段实际上应该是实际的主键。

于 2013-08-09T20:42:00.047 回答