如何通过索引(而不是id)在SQLite中获取一行

时间:2013-02-08 22:44:24

标签: android android-listview android-sqlite

有没有办法通过表中的索引/位置获取行,而不是通过其id?

例如,我有3行ID:

Record1
Record2
Record3

现在,如果我使用其id删除第二行,其余行将如下所示:

Record1
Record3

因为我使用ListView位置来确定要删除的数据库中的哪一行,所以下次我尝试删除第二行时,我会得到异常,因为id为2的行不存在。

那么有一种方法可以通过表中的索引检索行吗?

2 个答案:

答案 0 :(得分:6)

更好的路径是从ListView项表示的对象中获取记录的id,然后使用它来获取数据库中的正确记录。在ListView的{​​{1}}中,OnItemClickListener事件将onItemClick作为第一个参数,将所选项目的索引作为第二个参数。从适配器获取该项目并将其转换为它所代表的类型。

AdapterView

但是,如果您真的想获得第n 条记录,我相信您可以执行以下操作:

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    YourClass c = (YourClass)arg0.getItemAtPosition(arg2);
    //index of the record to delete can now be accessed at c.id
}

其中n是您所追求的指数。这也假设您的结果的排序方式与SELECT * FROM TableName LIMIT 1 OFFSET n; 中的结果相同。

答案 1 :(得分:1)

自从引入Android OS以来,

SQLite3 有了很大的改进。从official documentation(用我自己的话说):

SQLite表中的所有行都有一个64位带符号整数键,可唯一标识其表中的行。该整数通常称为“ rowid” 。可以使用不区分大小写的特殊名称之一来访问rowid值:rowidoid_rowid_代替列名。 (在早期的Android SQLite实现中,您必须使用_id来访问索引。)

所以今天您可以这样做:

    SELECT rowid,* FROM tt LIMIT 1 OFFSET 2;
    SELECT rowid,* FROM tt WHERE rowid=2;
    SELECT rowid,* FROM tt WHERE rowid=(SELECT MAX(rowid) FROM tt); -- to get last row index