我正在尝试使用ListAdapter来显示Cursor的结果。根据我的日志,一切都返回正确的结果,直到它到达这一点
ListAdapter adapter = new SimpleCursorAdapter(this,R.layout.cattle_layout,
c,new String[]{"c.animal_id, c.eartag"},new int[]{R.id.TextView_cattleId,R.id.TextView_earTag});
此时,程序抛出上述消息的异常,然后命名我要显示的两个字段 - 从那一点开始,接下来是java.lang.Exception然后引用AbstractCursor.getColumnIndexOrThrow < / p>
'new String [] creation“必须有问题,但我搜索过,找不到任何东西。
建议将不胜感激。
光标创建
String asColumnsToReturn[] ={
"tbl_cattle._id",
"tbl_cattle.animal_id",
"tbl_cattle.eartag"};
Cursor c = mDatabase.query(TABLE_CATTLE, asColumnsToReturn,"type_of_animal=?", new String[]{targetType},null, null, null, null);
Log.i(DEBUG_TAG, "Record Count " + c.getCount() + " Columns: " + c.getColumnCount());
我的日志为我提供了where子句的正确计数,正确的数据在记录中
答案 0 :(得分:2)
new String[]{"c.animal_id, c.eartag"}
到
new String[]{"c.animal_id", "c.eartag"}
(你把它们作为单个字符串。)
此外,如果您没有尝试将所有内容整合到一行中,那么读取,调试和维护代码会更容易。 “我用更少的线条做到了这一点”,这不是任何人真正关心的事情,但是“我不记得这应该做什么,我无法从阅读中弄明白”这是一个非常大的问题。
答案 1 :(得分:0)
我遇到了类似的问题,我认为Cursor可能无法正确检索我通过调用rawQuery()
检索到的名称中带有点的列名。例如。 c.animalId
无效,但我敢打赌如果您将预测更改为c_animalId
它会。它似乎对我有用。
在我在代码中遇到错误之前,我迭代了Cursor中的所有列,如果列等于投影,我会记录一条语句。在错误之前调试和设置断点我完全按照我在Cursor中的预期看到所有列。我知道Android没有在代码中的其他各个方面正确引用列名(这很荒谬),我认为这个问题与类似的问题有关。
答案 2 :(得分:-1)
尝试
new String[] { "COLUMNNAME_ANIMAL_ID", "COLUMNNAME_EARTAG" }
这两个字符串就是它们听起来的样子。你也应该使用静态字符串作为列名。在您的数据库中定义一次,如:
public final static String COLUMNNAME_ANIMAL_ID = animalId; // where animalId is how the SQL column will be named.
并使用DatabaseClass.COLUMNNAME_ANIMAL_ID
在这个例子中,您将使用:
new String[] { DatabaseClass.COLUMNNAME_ANIMAL_ID, DatabaseClass.COLUMNNAME_EARTAG }
这样你a)可以确定你的SQL中没有拼写错误,b)可以快速更改列/表/ DB名称1,2,3 - 无论你在哪里使用它们。