Android SQLite列和索引最佳实践

时间:2013-07-01 15:37:03

标签: android sqlite

我开始在我的Android应用中使用SQLite。我不是数据库的新手,我有多年的数据库工作与Delphi,它确实需要一些使用数据库的工作。

在应用中,可能有一个包含多个列的表。从表中读取数据时,执行一些SQL,然后使用游标访问数据。

游标上有几种方法可以访问数据,一种方法使用表中的列索引 - 我在网上看到的很多例子都使用了这种方法。例如:

cursor.getString(3);

在代码中嵌入“3”并不是最好的主意,因此您可以使用:

int idx = cursor.getColumnIndex( "THECOLUMNNAME" );
cursor.getString(idx);

对表和列多次使用getColumnIndex()是浪费的。保持索引的常量可能是几十或几十列很容易出错。

我的问题是 - 做这类事情的最佳做法是什么?

我应该扩展Cursor以更好地表示特定的表吗?

谢谢,

麦克

2 个答案:

答案 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。)如果查询涉及具有大量列的表,则可能需要缓存循环遍历结果中的行之前的列索引。

但正如其他人在评论中指出的那样,大量的列可能是数据库设计不佳的症状。