我开始在我的Android应用中使用SQLite。我不是数据库的新手,我有多年的数据库工作与Delphi,它确实需要一些使用数据库的工作。
在应用中,可能有一个包含多个列的表。从表中读取数据时,执行一些SQL,然后使用游标访问数据。
游标上有几种方法可以访问数据,一种方法使用表中的列索引 - 我在网上看到的很多例子都使用了这种方法。例如:
cursor.getString(3);
在代码中嵌入“3”并不是最好的主意,因此您可以使用:
int idx = cursor.getColumnIndex( "THECOLUMNNAME" );
cursor.getString(idx);
对表和列多次使用getColumnIndex()是浪费的。保持索引的常量可能是几十或几十列很容易出错。
我的问题是 - 做这类事情的最佳做法是什么?
我应该扩展Cursor以更好地表示特定的表吗?
谢谢,
麦克
答案 0 :(得分:3)
如果您的列很少,特别是当这些列没有正确的名称(例如SELECT MAX(x), MIN(x) FROM t
)时,使用固定列索引就完全可以了。
如果列的数量/顺序可能稍后更改,或者在源代码中查询与光标访问之间存在较大距离,则会更危险。
如果您想避免过多getColumnIndex
次调用,您应该确实缓存返回值。
使用包含列索引和游标引用的包装类可以使这更容易,如下所示:
Cursor cursor = db.query(...);
Field foo = new Field(cursor, "FOO");
Field bar = new Field(cursor, "BAR");
while (cursor.moveToNext()) {
foo.getString();
bar.getInteger();
}
(这个类的实现留作练习......)
答案 1 :(得分:1)
在Cursor的至少一些实现中,getColumnIndex遍历列名称数组(有关示例,请参阅here。)如果查询涉及具有大量列的表,则可能需要缓存循环遍历结果中的行之前的列索引。
但正如其他人在评论中指出的那样,大量的列可能是数据库设计不佳的症状。