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

Posted

技术标签:

【中文标题】如何通过索引(而不是 id)在 SQLite 中获取一行【英文标题】:How to get a row in SQLite by index (not by id) 【发布时间】:2013-01-24 19:24:19 【问题描述】:

有没有办法通过它在表中的索引/位置而不是它的 id 来获取一行?

例如,我有 3 行带有 ID:

Record1
Record2
Record3

现在如果我使用它的 id 删除第二行,剩下的行将是这样的:

Record1
Record3

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

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

【问题讨论】:

据我所知,没有。顺便问一下,“索引”到底是什么?数据库应该如何知道您在列表中显示数据的顺序? 那还有什么选择呢? 但是怎么做呢?除了使用列表中的位置来确定要删除哪一行之外,还有什么? 您应该使用CursorAdapter 和您的ListView "因为我使用 ListView 位置来确定要删除数据库中的哪一行,所以下次我尝试删除第二行时,我会得到异常,因为 id 为 2 的行不存在。 "只需使用数据库的主键而不是位置删除相应的行。 【参考方案1】:

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

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

但是,如果你真的想得到第nth条记录,我相信你可以做到以下几点:

SELECT * FROM TableName LIMIT 1 OFFSET n;

其中 n 是您所追求的索引。这还假设您的结果的排序方式与您在 ListView 中的方式相同。

【讨论】:

它起作用了,第二个,使用 LIMIT 和 OFFSET。谢谢。没试过其他的。 很高兴它有所帮助,但我强烈鼓励你回去并以另一种方式工作。【参考方案2】:

SQLite3 自引入 android 操作系统以来得到了极大的改进。来自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

【讨论】:

以上是关于如何通过索引(而不是 id)在 SQLite 中获取一行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中打开 SQLite 数据库?

如何从数据库中输入方法 ID 的输入参数,而不是使用 SQLite 的字段中的数字 - Xamarin

在应用于列的函数上创建索引:适用于一个安装,而不是另一个

如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id

如何不按位置而是按表sqlite中的_id切换到新Activity

SQLite 是不是创建一个我可以排序/获取的数字索引?