代码之家  ›  专栏  ›  技术社区  ›  oriharel

如何从光标中获取行ID

  •  17
  • oriharel  · 技术社区  · 14 年前

    如何从光标中获取行ID?

    6 回复  |  直到 7 年前
        1
  •  13
  •   naXa stands with Ukraine    9 年前

    我不认为光标直接暴露了这一点。
    SQLiteDatabase.insert() 返回新插入行的行ID。或者在Android中,约定是有一个名为 "_id" 它包含表的主要自动递增键。所以 cursor.getLong(cursor.getColumnIndex("_id")) 会找回这个。

        2
  •  4
  •   Luigi Putanesca    12 年前

    我遇到了同样的问题,主键的列索引报告为-1(意味着它不存在)。问题是我忘了在创建光标的初始select子句中包含id列。一旦我确定它包括在内,就可以像其他任何列一样访问该列。

        3
  •  3
  •   Parvin Gasimzade    12 年前

    关于尼克·斯特朗回答的最后一句话,下面的命令对我不起作用。 cursor.getColumnIndex("_id") 仍然是- 1

     cursor.getLong(cursor.getColumnIndex("_id"))
    

    可能是我的配置中有其他问题导致了这个问题?

    就我个人而言,我在创建的每个表中维护自己的自定义唯一ID列,这很麻烦,但它解决了这个问题。

        4
  •  2
  •   Arkadiusz Cieśliński    9 年前
    return sqlite_db.query(table, new String[] { "rowid", "*" }, where, args, null, null, null);
    

    在我的示例中,datamanager.field_id中有“rowid”,这是sqlite标识列(sqlite中的每个表都有这种特殊的列),因此我不需要表中任何自定义的唯一ID列。

        5
  •  0
  •   Ferran Maylinch    9 年前
    Cursor cursor = mySQLiteHelper.getReadableDatabase().query(TABLE_NAME, new String[] { "ROWID", "*" }, where, null, null, null, null);
    

    然后

    long rowId = cursor.getLong(0);
    
        6
  •  0
  •   MikeT    7 年前

    只要未使用 without rowid定义表,则可以获取 rowid (或should that be rowid see below for case)如果将其指定为要检索的列。

    例如,对于具有3个已定义列(名称、颜色和年龄)且没有常规列的表。以下rawquery工作并返回-

    cursor csr=db.rawquery(“select name,colour,age,rowid from”+table ou name,null);
    < /代码> 
    
    

    注意!光标中的列名称是小写的-

    <> >注意!rowidin theselect sqlis case independent(例如rowid works).

    使用

    cursor csr=db.rawquery(“select*from”+table\u name,null);
    < /代码> 
    
    

    will notreturn therowid(同样,当使用query方法时,对于列为空)。

    使用query>(as oppost torawquery(as oppost torawquery=)以同样的方式工作,即您需要指定rowid(note alternations to rowid below)作为要检索的列,例如:-

    cursor csr=db.query(table\u name,new string[]){
    “类”
    “姓名”,
    “颜色”,
    “时代”
    },空,空,空,空,空);
    < /代码> 
    
    

    rowid的替代方案

    代替rowid,您也可以使用rowid-oid>(case independent)作为查询中的列名称,注意结果光标中的列名称是rowidi.e.it is lowercase.

    罗维德如果将其指定为要检索的列,请参见下面的案例)。

    例如,对于具有3个定义列(名称、颜色和年龄)的表,不使用常规圣婴列。以下rawquery工作并返回罗维德-

    Cursor csr = db.rawQuery("SELECT Names, Colour, Age, ROWID FROM " + TABLE_NAME,null);
    

    注意!光标中的列名是小写的按:

    enter image description here

    注意!罗维德选择SQL与大小写无关(例如rowid works)。

    使用

    Cursor csr = db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
    

    不会返回罗维德(在使用query方法)。

    使用查询(而不是rawQuery)工作原理相同,即需要将rowid(注意下面rowid的替代项)指定为要检索的列,例如:-

    Cursor csr = db.query(TABLE_NAME,new String[]{
                    "OiD",
                    "Names",
                    "Colour",
                    "Age"
            },null,null,null,null,null);
    

    rowid的替代方案

    而不是ROWID,也可以使用_ROWID_OID(不区分大小写)作为查询中的列名,注意结果光标中的列名是罗维德它是小写字母。.