【问题标题】:Using SimpleCursorAdapter with Spinner?将 SimpleCursorAdapter 与 Spinner 一起使用?
【发布时间】:2022-02-04 05:47:15
【问题描述】:

我有一个数据库,其中表“mytable”有 2 个列“id”、“sampletext” 我想使用 SimpleCursorAdapter 查询 sampletext 的不同值并提供给 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”,我做错了什么? 感谢任何建议

【问题讨论】:

    标签: android android-cursor simplecursoradapter


    【解决方案1】:
    what am i doing wrong
    

    你没有阅读文档...

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

    第一个告诉 sqlite 哪些列应该被带到 Cursor,第二个告诉 Adapter 哪些应该被显示/映射到单行视图...

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

    所以现在很明显我们应该这样做:

    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);
    

    【讨论】:

    • 抱歉,应该更正确地检查文档。我没有错误,但存在不同的逻辑问题。因为当我使用查询 DISTINCT 时 _id 是主键,所以我最终得到游标中的所有行。有什么建议吗?
    • 不抱歉 :) ...我知道了解新平台需要时间...我希望这个答案对您有所帮助 :)
    • 如果我们不知道 sdb.query 做了什么,很难说我们如何为您提供帮助......我很确定 sdb 不是 SQLiteDatabase 的实例,而是一些一种你自己的帮助类
    • sdb 是 sqlitedatabase 的实例,我创建了一个带有虚拟值的表,并尝试使用 CursorAdapter 使用其中一列的不同值填充微调器。
    • 看来你的数据库没有规划好......我认为应该有 2 个表,其中一个用于类似的行,就像你现在拥有的 table1(_id, col1, col3, sampletext_but_not_as_text_as__id_from_second_table) 和第二个表 table2(_id, sampletext_value_text) ...对于您正在使用的微调器table2 ... Selvin out!(没有时间)
    【解决方案2】:

    这是一个原始查询的示例。请注意,查询返回的第一个 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);  
    

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多