1

我有一个 Sqlite 数据库表,其中包含以下列:_id、键(int)、名称(文本)。这里的 key 是唯一的 key。假设我在表中有以下行:

_id | 关键 | 姓名

1 | 2 | n2

2 | 3 | n3

3 | 5 | n5

4 | 6 | n6

现在,我必须显示该表的列表视图,从 key=1 开始,如果键存在,我将显示键后跟名称,但如果表中不存在键,我将显示键后跟“未分配” . 如何使用 CursorAdapter 做到这一点?例如,对于上面的表格,我将显示如下列表视图:

  1. 未分配
  2. n2
  3. n3
  4. 未分配
  5. n5
  6. n6
4

3 回答 3

0

我认为这是两种最简单的方法:

  • 为所有可能的键创建空行

    当您在数据库中插入新行时,假设 key = 9,检查数据库中当前最高的键(此处为 6)并NULL在此和您的之间创建空行(名称设置为或空字符串)新行。
    然后在您CursorAdapter的名称中,如果名称为空,您可以轻松显示“未分配”。

  • 子类CursorWrapper

    另一种方法是子类化CursorWrapper并覆盖move(), moveToNext(), getCount(), ... 以模拟空行。这更灵活,需要更少的空间和数据库操作,但有些方法可能难以实现(你将如何编写getCount()?它应该返回最高的键,但如何有效地找到它?)。

于 2013-10-14T09:37:36.770 回答
0

问题是您的数据库说明哪些元素应该显示在您的列表中,而您想要显示不在您的数据库中的列表项。我会说你需要在数据库和视图组件之间的中间有一个助手来加载你的数据库内容,将缺失的行添加到一组完整的数据中,并将这组数据(sqlite 数据 + 缺失的行)提供给适配器类. 然后知道您的适配器列表中的行数,并可以创建此数量的视图。现在您拥有相同数量的数据对象和视图。

也许这可以帮助你。它是 google 的一个示例,用于将您的光标转换为对象。然后你可以使用 ArrayAdapter。

于 2013-10-14T10:00:35.350 回答
0

使用 CursorAdapter 我认为您不容易做到。这种适配器的数据集是数据库中结果集上的光标。您的结果集中没有那些“未分配”的行,并且更改 SQL 以获取它们会很尴尬。如果你真的想这样做,你需要在 SELECT 列表中使用 IFNULL(name, 'Not assigned') 右连接到另一个序列号表(在 your_table.key = number_table.number 上)。您还需要为此使用原始查询。

我建议使用 ArrayAdapter,它是通过遍历结果光标并在进行时识别间隙来构建的。示例伪代码:

listArray = new ArrayList<String>();
int count = 1;
while (cursor.moveToNext())
{
    get key and name from cursor row
    while (count < key)  //Add 'not assigned' for any gaps
    {
        listArray.add(String.valueOf(count) + ":" + "not assigned");
        count++;
    }
    listArray.add(String.valueOf(count) + ":" + name);
    count++;
}
cursor.close();

然后使用 listArray 作为 ArrayAdapter 的数据集。

于 2013-10-14T09:39:52.570 回答