3

我开始在我的 Android 应用程序中使用 SQLite。我对数据库并不陌生,我在 Delphi 上做了很多年的数据库工作,这确实减少了使用数据库的一些工作。

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

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

cursor.getString(3);

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

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

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

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

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

谢谢,

麦克风

4

2 回答 2

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();
}

(这个类的实现留作练习......)

于 2013-07-01T16:55:43.170 回答
1

至少在 Cursor 的某些实现中,getColumnIndex 遍历列名数组(参见此处的一个示例。)如果您的查询涉及具有大量列的表,您可能希望在循环之前缓存列索引结果中的行。

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

于 2013-07-01T16:09:50.170 回答