在我的应用程序中,我有一个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在这里不会帮助我?我该怎么做呢?
答案 0 :(得分:1)
SimpleCursorAdapter
无法帮助你。
如果您的目标是希望一行是一个音符及其所有标记,则可以尝试覆盖bindView()
中的SimpleCursorAdapter
并以此方式填写标记。这意味着您已经构建了某种HashMap
note->标记,因此可以快速确定要在行中添加的标记。
要建立HashMap
,我有两个选择:
通过查找HashMap
中的注释动态构建它们,然后执行查询以获取该注释的标记(如果找不到它们),将其缓存在{{1}中以后重用(例如,滚动)。这里的问题是你正在做一堆小查询(坏)并在用户滚动时在主应用程序线程上执行它们(非常糟糕)。
使用HashMap
子句执行一个大查询以获取所有注释的所有标记,并将生成的IN
转换为完全填充的Cursor
。然后,您的每行查找都将成功。如果您只有适度的行数,这很有效;否则,此查询可能需要比用户耐心更长的时间。
如果您的架构是灵活的,您可以考虑是否更好地使用一些非规范化服务,例如通过逗号分隔列表或其他东西将注释放在notes表的单个列中。即使这会使写入操作复杂化(例如,将标记放在两个位置),如果您的读取数量大大超过您的写入数量,那么它可能是值得的。