如何通过索引(而不是 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,然后使用它在数据库中获取正确的记录。在您的ListView
的OnItemClickListener
中,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 值:
rowid
、oid
或_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 中获取一行的主要内容,如果未能解决你的问题,请参考以下文章
如何从数据库中输入方法 ID 的输入参数,而不是使用 SQLite 的字段中的数字 - Xamarin
如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id