【问题标题】:ANDROID SQLITE: How to retrieve primary key of a certain row [duplicate]ANDROID SQLITE:如何检索某行的主键[重复]
【发布时间】:2013-08-09 20:33:17
【问题描述】:

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

    }

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

非常感谢!

【问题讨论】:

    标签: java android sql database sqlite


    【解决方案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

    【讨论】:

      【解决方案2】:

      here 的答案将为您提供获取最后一个插入 ID 所需的信息。

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

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

      因此,获取最后一行 ID 容易出现并发问题。

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-21
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        相关资源
        最近更新 更多