我有一个Sqlite数据库表,其中包含以下列:_id,key(int),name(text)。这里的密钥是一个唯一的密钥。假设我在表中有以下行:
现在,我必须显示此表的列表视图,从key = 1开始,如果键存在,我将显示键后跟名称但是如果键不存在,我将显示键,然后是“未分配”在表中。如何使用CursorAdapter执行此操作? 例如对于上表,我将显示如下列表视图:
答案 0 :(得分:0)
我认为这是最简单的两种方式:
为所有可能的键创建空行
当您在数据库中插入新行时,假设使用key = 9,检查数据库中当前最高的键(此处为6)并创建空行(名称设置为NULL
或这个和你的新行之间的一个空字符串。
然后在您的CursorAdapter
中,如果名称为空,则可以轻松显示“未分配”。
子类CursorWrapper
另一种方法是子类CursorWrapper
并覆盖move()
,moveToNext()
,getCount()
,...来模拟空行。这更灵活,需要更少的空间和数据库操作,但有些方法可能很难实现(如何编写getCount()
?它应该返回最高密钥,但如何有效地找到它?)。
答案 1 :(得分:0)
使用CursorAdapter,我认为你不能轻易做到。此类适配器的数据集是数据库中结果集的游标。您的结果集中没有那些“未分配”的行,并且更改SQL以获取它们将很难做到。如果你真的想这样做,你需要在SELECT列表中使用IFNULL(名称,'未分配')将RIGHT JOIN连接到另一个连续数字表(在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的数据集。
答案 2 :(得分:0)
问题是您的数据库说明应在列表中显示哪些元素,并且您希望显示不在数据库中的列表项。我会说你需要像数据库和视图组件之间的中间帮助程序来加载数据库的东西,将缺少的行添加到一组完整的数据中,并将这组数据(sqlite数据+缺少的行)提供给适配器类。然后知道您的适配器列表中的行数,并可以创建此数量的视图。现在您拥有相同数量的数据对象和视图。
也许这可以帮到你。这是谷歌将光标转换为对象的一个例子。然后你可以使用ArrayAdapter。