Android SQLite列和索引的最佳实践

3
我开始在我的Android应用中使用SQLite。我并不是对数据库一无所知,我已经有多年使用Delphi进行数据库工作的经验,这使得使用数据库变得更加容易。
在应用程序中,可能会有一个包含多个列的表格。当从表格中读取数据时,需要执行一些SQL语句,然后使用游标来访问数据。
有几种方法可以使用游标来访问数据,其中一种是使用表中的列索引-我在网上看到的许多例子都使用这种方法。例如:
cursor.getString(3);

将“3”嵌入代码中并不是最好的想法,所以您可以使用:

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

对于一个表格和列,多次使用getColumnIndex()是浪费的。保留可能有几十个或几百个列索引的常量容易出错。

我的问题是 - 在做这种事情时最佳实践是什么?

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

谢谢,

迈克


2
在我看来,“有数百列的表”是糟糕的表设计的标志,特别是对于移动应用程序而言。 - Lukas Knuth
1
使用 getColumnIndex 是执行此操作的最佳实践。 - Volodymyr Yatsykiv
好的-我指的是数百个表中的数百列。仍然需要跟踪数百个列索引。 - Michael Vincent
@ Volodymyr - 你会为了一个给定的查询多久调用getColumnIndex吗?你会缓存列索引,还是每次都浪费时间解析字符串?如果你缓存索引,你会编写代码为每个查询执行此操作,还是扩展游标或其他内容以跟踪索引,以便只需编写一次代码?我认为这个问题比仅仅使用getColumnIndex()更深入。敬礼。 - Michael Vincent
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();
}

(此类的实现留作练习...)

1
在Cursor的某些实现中,getColumnIndex会遍历一组列名的数组(参见这里的示例之一)。如果您的查询涉及具有大量列的表,则可能需要在循环遍历结果行之前缓存列索引。

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

谢谢,我会查看那个链接的。再次声明-它并不意味着一个表中有大量的列,而是一个拥有多个表的应用程序可以很容易地拥有100个列。我曾经使用过规范化良好的数据库,其中表格有10列。我想我会编辑原始帖子来表达这一点。 - Michael Vincent

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