当每个对象位于Cursor中的多个行上时,在ListView中显示数据

时间:2011-01-08 22:32:19

标签: android listview cursor

在我的应用程序中,我有一个sqlite数据库,如下所示:

CREATE TABLE notes (_id integer primary key, 
                    content text);
CREATE TABLE tags (_id integer primary key,
                   name text,
                   noteid integer,
                   foreign key(noteid) references notes(_id));

我正在存储可能包含与之关联的标签的文字。现在我想在ListView中显示此文本和标签。但是,我无法弄清楚如何使用SimpleCursorAdapter执行此操作。它甚至可能吗?我的数据可能如下所示:

sqlite> select * from notes;
1|foo bar baz
sqlite> select * from tags;
1|x|1
2|y|1

获取所有笔记及其返回的数据的查询如下所示:

sqlite> select notes._id, notes.content, tags.name from notes, tags where notes._id = tags.noteid;
1|foo bar baz|x
1|foo bar baz|y

现在,如果我想以某种方式将此数据绑定到ListView,该怎么做?如果ListView中的每一行包含两行,一行包含内容,一行包含所有标记,我会很高兴。我是否正确地猜测SimpleCursorAdapter在这里不会帮助我?我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

SimpleCursorAdapter无法帮助你。

如果您的目标是希望一行是一个音符及其所有标记,则可以尝试覆盖bindView()中的SimpleCursorAdapter并以此方式填写标记。这意味着您已经构建了某种HashMap note->标记,因此可以快速确定要在行中添加的标记。

要建立HashMap,我有两个选择:

  1. 通过查找HashMap中的注释动态构建它们,然后执行查询以获取该注释的标记(如果找不到它们),将其缓存在{{1}中以后重用(例如,滚动)。这里的问题是你正在做一堆小查询(坏)并在用户滚动时在主应用程序线程上执行它们(非常糟糕)。

  2. 使用HashMap子句执行一个大查询以获取所有注释的所有标记,并将生成的IN转换为完全填充的Cursor。然后,您的每行查找都将成功。如果您只有适度的行数,这很有效;否则,此查询可能需要比用户耐心更长的时间。

  3. 如果您的架构是灵活的,您可以考虑是否更好地使用一些非规范化服务,例如通过逗号分隔列表或其他东西将注释放在notes表的单个列中。即使这会使写入操作复杂化(例如,将标记放在两个位置),如果您的读取数量大大超过您的写入数量,那么它可能是值得的。