如何在SQLite中通过索引(而不是通过ID)获得一条记录

3 人关注

有没有一种方法可以通过其索引/在表中的位置而不是通过其ID来获取一条记录?

例如,我有3条带有ID的记录。

Record1
Record2
Record3

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

Record1
Record3

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

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

5 个评论
Dan
就我所知,没有。顺便问一下,"索引 "到底是什么?数据库应该如何知道你在列表中显示数据的顺序?
那有什么办法呢?
除了列表中的位置外,还可以用什么来确定要删除哪一行?
Dan
你应该使用一个 CursorAdapter 与你的 ListView
Sam
"因为我使用ListView的位置来确定要删除数据库中的哪一行,下次我试图删除第二行时,会得到异常,因为id为2的行不存在。"只需使用数据库的主键而不是位置来删除相应的行。
android
android-listview
android-sqlite
pedja
pedja
发布于 2013-02-09
2 个回答
Blumer
Blumer
发布于 2020-09-24
已采纳
0 人赞同

更好的方法是从 ListView 项所代表的对象中获取记录的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。谢谢。没有尝试其他的。
很高兴能帮上忙,但我想 strongly 鼓励你回去后以另一种方式工作。
not2qubit
not2qubit
发布于 2020-09-24
0 人赞同

SQLite3 自安卓操作系统推出以来,已经有了很大的改进。从 正式文件 (并用我自己的话说)。

在SQLite表中的所有行都有一个64位带符号的整数键,用于唯一地识别其表中的行。这个整数通常被称为 "rowid" .rowid值可以使用独立于大小写的特殊名称之一来访问。 rowid oid _rowid_ ,以代替列名。(在早期的Android SQLite实现中,你必须使用 _id 来访问索引)。