使用SimpleCursorAdapter和Spinner?

4

我有一个名为"mytable"的数据库表,包含2个列"id"和"sampletext"。我想查询"sampletext"的不同值,并使用SimpleCursorAdapter将其提供给Spinner。

这是我的尝试:

String[] cols=new String[]{"sampletext"};
int[] lbls=new lbls[]{android.R.id.text1};
mycursor=sdb.query(true,"mytable", cols,null,null,null,null,null,null);
sca=new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mycursor, cols,lbls,0);
sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spn.setAdapter(sca);

当我运行这个程序时,在第4行出现了错误: id不存在。 当我将第一行改为“id”时,下拉列表的选项被填充为id值。 但是我需要“sampletext”,我做错了什么? 感谢任何建议。

3个回答

14
what am i doing wrong

你没有阅读文档...

有两个字符串数组,拥有列:第一个在查询中使用,第二个在适配器构造函数中使用(你只使用了一个数组来代替两个)

第一个告诉SQLite应该选择哪些列到Cursor中,第二个告诉Adapter应该将哪些列显示/映射到单个行中的视图中...

接下来,CursorAdapter需要一个名为_id的列的Cursor

因此现在很明显我们应该做类似这样的事情:

String[] queryCols=new String[]{"_id", "sampletext"};
String[] adapterCols=new String[]{"sampletext"};
int[] adapterRowViews=new int[]{android.R.id.text1};
mycursor=sdb.query(true,"mytable", queryCols,null,null,null,null,null,null);
sca=new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mycursor, adapterCols, adapterRowViews,0);
sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spn.setAdapter(sca);

抱歉,我应该更仔细地查看文档。我没有错误信息,但存在不同的逻辑问题。由于_id是主键,当我使用DISTINCT查询时,会得到游标中的所有行。有什么建议吗? - Deepak
不用担心 :) ... 我理解学习新平台需要时间 ... 希望我的回答对你有所帮助 :) - Selvin
如果我们不知道sdb.query的作用,很难说我们如何帮助您... 我相信sdb不是SQLiteDatabase的实例,而是您自己的某种辅助类。 - Selvin
sdb是sqlitedatabase的一个实例,我创建了一个带有虚拟值的表,并尝试使用CursorAdapter从其中一列的不同值填充一个下拉列表。 - Deepak
似乎你的数据库规划得不太好...我认为应该有两个表,一个用于类似于现在的行 table1(_id, col1, col3, sampletext_but_not_as_text_as__id_from_second_table),第二个表是 table2(_id, sampletext_value_text) ... 对于 spinner 你正在使用 table2 ... Selvin 离开了!(没时间了) - Selvin

1
这是一个使用原始查询的示例。请注意,查询返回的第一列ID应该标记为_id

MyDatabase.java:

public class MyDatabase extends SQLiteAssetHelper {
     ...
    public Cursor getListNamesForDropDown() {
        SQLiteDatabase db = getReadableDatabase();
        String sql = "select ID _id, Name from MyTable order by Name ";
        Cursor c = db.rawQuery(sql, null);
        c.moveToFirst();
        return c;
    }

MyActivity.java:

        @Override
        public void onCreate(Bundle savedInstanceState) {
....    
           Cursor cursorTest =  db.getListNamesForDropDown();
           android.widget.SimpleCursorAdapter  adapter = new android.widget.SimpleCursorAdapter(this, 
                   android.R.layout.simple_spinner_item,
                    cursorTest, 
                    new String[] {"Name"}, 
                    new int[] {android.R.id.text1}, 0);       
           adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
           spinnerTest.setAdapter(adapter);  

0
android.widget.SimpleCursorAdapter adapter = new android.widget.SimpleCursorAdapter(this,
            android.R.layout.simple_spinner_item,
            cursor,
            new String[] { DBOpenHelper.ACCOUNT_BANK },
            new int[] { android.R.id.text1 }, 0);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接