SQLite,Android:如果我知道 ColumnIndex,我可以绕过调用 cursor.getColumnIndex(COLUMN_NAME) 吗?
SQLite, Android : Can I bypass the call cursor.getColumnIndex(COLUMN_NAME) if I know the ColumnIndex?
我是 Android 的新手。对于游标处理,我发现了一场争论,这让我很困惑。
让我们考虑调用
public static final String COLUMN_NAME = "my_column_name";
cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
现在我正在阅读关于 cursor.getColumnIndex 函数正在增加游标循环开销并因此在循环之前调用的争论。 (有一个反驳论点说最近的编码已经放置了一个一次性地图)。这个索引是在我创建 table 时隐式创建的,因此我被迫调用它吗?如果是这样,这不是适得其反吗?
或
这个索引只是列名的映射,第一列是 0,第二列是 1 等等,因此如果我知道 table 的创建语句语法,我可以很容易地识别列索引我自己?
如果有人指导我做进一步的说明,我将非常高兴。提前致谢。
This index is a map of column names only and the first column is 0,
second column is 1 and so on and therefore if I know the create
statement syntax for the table, I can easily identify the column index
myself?
以上问题的答案是是。
好吧,您可以将索引直接传递给 cursor.getString
或任何其他相应的方法,但是您应该调用 cursor.getColumnIndex(COLUMN_NAME)
只是为了安全起见,这样您就不会为游标提供错误的索引。所以你可以做一件事,在循环开始之前调用 cursor.getColumnIndex(COLUMN_NAME)
并将索引存储在变量中,然后在循环中使用保存索引值的变量。
我的建议是使用 sqlite 的房间持久性库,你迟早会爱上它的。
Is this index implicitly created when I am creating the table...
一个Cursor
对象实例与一个table没有直接关系。
它是 query 的结果,它包含比行和列值更多的信息,例如行数、列名和内部每一列的索引结果集。
并非所有查询都像这样简单:
SELECT * FROM tablename
如果您在 SELECT
列表中以特殊顺序枚举它们,您可以查询单个 table 并以您想要的任何顺序获取列,或者省略您不需要的列想要:
SELECT column2, column4, column1 FROM tablename
或者您可以使用连接和 return 查询多个 table 的某些列:
SELECT t1.somecolumn, t2.othercolumn FROM table1 t1 INNER JOIN table2 t2 ON ...
所以不要认为 Cursor
代表 table 的内容,这就是为什么你应该总是使用 getColumnIndex()
.
即使您正在执行最简单的查询(例如此答案顶部的查询),因为它更安全并且始终有效。
当您遍历查询的所有行和列时,这可能会增加更多负担,但在这种情况下,您可以在循环之前将列的索引存储在变量中,并在循环内使用变量。
我可能不会使用 getColumnIndex()
的唯一情况是单列结果集,因为在那种情况下我确信调用 getString(0)
会起作用。
我是 Android 的新手。对于游标处理,我发现了一场争论,这让我很困惑。 让我们考虑调用
public static final String COLUMN_NAME = "my_column_name";
cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
现在我正在阅读关于 cursor.getColumnIndex 函数正在增加游标循环开销并因此在循环之前调用的争论。 (有一个反驳论点说最近的编码已经放置了一个一次性地图)。这个索引是在我创建 table 时隐式创建的,因此我被迫调用它吗?如果是这样,这不是适得其反吗?
或
这个索引只是列名的映射,第一列是 0,第二列是 1 等等,因此如果我知道 table 的创建语句语法,我可以很容易地识别列索引我自己?
如果有人指导我做进一步的说明,我将非常高兴。提前致谢。
This index is a map of column names only and the first column is 0, second column is 1 and so on and therefore if I know the create statement syntax for the table, I can easily identify the column index myself?
以上问题的答案是是。
好吧,您可以将索引直接传递给 cursor.getString
或任何其他相应的方法,但是您应该调用 cursor.getColumnIndex(COLUMN_NAME)
只是为了安全起见,这样您就不会为游标提供错误的索引。所以你可以做一件事,在循环开始之前调用 cursor.getColumnIndex(COLUMN_NAME)
并将索引存储在变量中,然后在循环中使用保存索引值的变量。
我的建议是使用 sqlite 的房间持久性库,你迟早会爱上它的。
Is this index implicitly created when I am creating the table...
一个Cursor
对象实例与一个table没有直接关系。
它是 query 的结果,它包含比行和列值更多的信息,例如行数、列名和内部每一列的索引结果集。
并非所有查询都像这样简单:
SELECT * FROM tablename
如果您在 SELECT
列表中以特殊顺序枚举它们,您可以查询单个 table 并以您想要的任何顺序获取列,或者省略您不需要的列想要:
SELECT column2, column4, column1 FROM tablename
或者您可以使用连接和 return 查询多个 table 的某些列:
SELECT t1.somecolumn, t2.othercolumn FROM table1 t1 INNER JOIN table2 t2 ON ...
所以不要认为 Cursor
代表 table 的内容,这就是为什么你应该总是使用 getColumnIndex()
.
即使您正在执行最简单的查询(例如此答案顶部的查询),因为它更安全并且始终有效。
当您遍历查询的所有行和列时,这可能会增加更多负担,但在这种情况下,您可以在循环之前将列的索引存储在变量中,并在循环内使用变量。
我可能不会使用 getColumnIndex()
的唯一情况是单列结果集,因为在那种情况下我确信调用 getString(0)
会起作用。