SQLite创建表的列索引顺序

5
这是我用来创建表的查询语句。
create table site_table(
   _id integer primary key autoincrement,
   name_site text,
   url text,
   login text,
   pass text
);

我调用了Cursor.getColumnNames(),发现列的顺序为id、login、pass、name、url

因此,如果我想获取某个值,我必须通过索引Cursor.getString(index)来获取它。在调试之前,我经常弄错索引,但是现在我想知道,为什么SQLite会以这种方式保存?为什么它不遵循我创建的id、name_site、url、login和pass的方式呢?

谢谢

4个回答

5
因此,如果我想得到一个值,就必须通过索引来获取 Cursor.getString(index)。
例如,因为这个原因,你应该总是使用:
c.getString(c.getColumnIndex("ColName")); // or better getColumnIndex(CONSTANT)

这种方法可以确保我们所有人都能得到正确的结果。通常推荐使用此方法,并且将COLUMN_NAMES存储为一个单独的类中的CONSTANTS非常有用和高效。

注意:顺序取决于投影,即select name, lastname from table


谢谢你的回答,它解决了我的问题。针对那个注意事项,我猜不是那种情况,因为在查询方法中,我没有指定列顺序。方法:database.query(TABLE_NAME, WHERE ID, ..其余为空)。 - Rigotti
@Rigotti 没关系 :) 我只是提到如果你使用原始语句,它也取决于投影。 - Simon Dorociak

1
那些数据按照你查询时请求的顺序排序,而不是你创建表格时的顺序。因此,你可能更改了生成光标的查询中的顺序。

1

您的光标中列的顺序取决于投影。为确保使用正确的列索引,请使用c.getString(c.getColumnIndexOrThrow("COLUMN_NAME")),其中c是您的光标。


0
我刚刚亲身经历了这个问题:
在执行
SELECT * FROM mytable WHERE ...
查询后,游标的列索引有时(不总是)与 SQLITE 数据库浏览器在“数据库结构”选项卡中显示的列顺序不同。因此,通过 getColumnIndex 引用列似乎是唯一安全的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接