2

先生,我如何根据输入名称、编号返回数据库的 rowid?此代码每次都返回值 0。我的主键是 KEY_ROWID。提前感谢您的帮助

//get rowid
public long getRowId(String name, String number) 
{
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_NUMBER};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_NUMBER+ "=" +number, null, null, null, null);

    long rowid = c.getColumnIndex(KEY_ROWID);
    return rowid;
}

这是我如何访问它

public void onClick(View arg0) {
            nameChanged = sqlName.getText().toString();
            numChanged = sqlNumber.getText().toString();
            GroupDb info = new GroupDb(EditDetails.this);
            info.open();
            long rowid = info.getRowId(name, num);
            info.updateNameNumber(rowid, nameChanged, numChanged);
            Toast.makeText(getApplicationContext(), rowid+" "+nameChanged+" "+numChanged, Toast.LENGTH_LONG).show();
            ArrayList<Contact> searchResults = info.getView();
            MyCustomBaseAdapter mcba = new MyCustomBaseAdapter(EditDetails.this, searchResults);
            mcba.updateResults(searchResults);
            Toast.makeText(getApplicationContext(), "Update Successful!", Toast.LENGTH_LONG).show();
            info.close();
            }
        });
4

1 回答 1

6

来自精美手册

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
[...]
返回

一个Cursor对象,位于第一个条目之前。

所以首先你已经c进入了结果集,你可以使用moveToFirst它:

c.moveToFirst();

现在您需要从光标指向的行中提取 rowid。但是getColumnIndex用于将列名映射到行中的位置:

返回给定列名的从零开始的索引,如果该列不存在,则返回 -1。

你得到一个零,getColumnIndex因为你KEY_ROWID是你的 SELECT 查询中的第一列。

我认为您正在寻找getLong是否long要从Cursor' 结果集中提取 a :

long rowid = c.getLong(c.getColumnIndex(KEY_ROWID));

如果您知道查询的结构(您知道),则可以跳过getColumnIndex调用并仅使用已知索引:

long rowid = c.getLong(0);

如果您所做的只是查找 rowid,您可以 SELECT 只是KEY_ROWID

String[] columns = new String[]{KEY_ROWID};

无需从数据库中提取您忽略的内容。

于 2012-12-03T06:35:14.527 回答