【问题标题】:How to pass the data in the database to a spinner如何将数据库中的数据传递给微调器
【发布时间】:2019-10-13 17:11:03
【问题描述】:

我正在创建一个方法来读取数据库中的所有信息并通过微调器查看它这里是我为这个函数尝试的代码

public Spinner loadArtist(){
        SQLiteDatabase DB = getReadableDatabase();

        String[] projection = {
                ArtistMaster.Artist.ARTIST_NAME};

        Cursor cursor = DB.query(
                ArtistMaster.Artist.TABLE_ARTIST,
                projection,
                null,
                null,
                null,
                null,
                null);

        Spinner itemIds = new ArrayList<>();
        while(cursor.moveToNext()) {
            long itemId = cursor.getLong(
                    cursor.getColumnIndex(ArtistMaster.Artist.ARTIST_NAME));
            itemIds.setAdapter(itemId);
        }
        cursor.close();
        return itemIds;
    }

但它在这一行给了我一个错误Spinner itemIds = new ArrayList&lt;&gt;(); 我应该将其声明为列表而不是微调器

【问题讨论】:

  • 显然是的。

标签: android sqlite android-studio android-sqlite android-sql


【解决方案1】:

itemIds 应定义为ArrayList&lt;Long&gt;Spinner 是 UI 元素,ArrayList 是数据结构。您很可能需要使用某种适配器将数据映射到您的 UI,例如。 ArrayAdapter:

Spinner spinner = ... // findViewById, new Spinner() etc.
ArrayList<Long> itemIds = new ArrayList<>();
//... fill array with artist IDs

spinner.setAdapter(
    new ArrayAdapter(
        this, // Context, Activity etc.,
        android.R.layout.simple_list_item_1, // Spinner TextView item resource ID
        itemIds // Data set. 
));

默认情况下,ArrayAdapter 将对集合中的每个数据对象调用 Object#toString()

【讨论】:

    【解决方案2】:

    我建议如果您使用 Cursor Adpater 会更容易,因为它们被设计为与 Cursor 一起使用并且不需要生成数组。

    SimpleCursorAdapter 就是这样一个简单但仍然非常灵活的适配器,可与光标一起使用。

    唯一的问题是游标适配器需要一个列名,特别是 _idBaseColumns._ID 对此进行解析(如下所示))。

    1. 首先有以下成员变量(显然名称可以是你想要的)

    :-

    Cursor mCursor;
    SimpleCursorAdapter mAdapter;
    Spinner spinner;
    SQLiteDatabase db;
    
    1. onCreate方法的activity中有

    :-

    spinner = this.findViewById(R.id.?????); //
    db = ???????? (as per your existing code)
    manageSpinner();
    
    1. 有方法

    :-

    private void manageSpinner() {
        mCursor = db.query(
                ArtistMaster.Artist.ARTIST_NAME,
                new String[]{"*","rowid AS " + BaseColumns._ID}, //<<<<<<<< adds _ID column (unless the table is a WITHOUT ROWID table, pretty unlikely)
                null,null,null,null,null
        );
        if (mAdapter == null) {
            mAdapter = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_1,
                    mCursor,
                    new String[]{"the_column"}, // column(s) from which to extract data
                    new int[]{android.R.id.text1}, // layout views into which the data is placed
                    0
            );
            spinner.setAdapter(mAdapter);
            // You want want to do something when an Item in the spinner is clicked (this does nothing as it is)
            spinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //........... do your stuff here
                    // notes
                    // id will be the id of the row 
                    // cursor will be positioned, so you can access data from the cursor if needed
                }
            });
        } else {
            mAdapter.swapCursor(mCursor);
        }
    
    }
    
    1. 使用
    2. 覆盖活动的 onResume(返回活动时刷新微调器,因为基础数据可能已更改)和 onDestroy(关闭光标)方法

    :-

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCursor.close();
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        manageSpinner();
    }
    

    【讨论】:

    • 这是不对的,我不能在 DBHandler 类中按 id 调用查找视图
    • @GroupAssignment 您通常不会将微调器放在 DBHandler 类中,而是将其放在获取 DBHanlder 实例的活动中。 DBHanlder 应该用于处理数据库。因此,在 activity 中,您将拥有一个用于处理程序的类成员变量,例如DBHandler mDBHandler; 在 onCreate 你实例化 DBHandler 例如mDBHandler = new DBHandler(this); 然后你可以使用db = DBHandler.getWritableDatabase();,因此 db 是一个 SQLiteDatabase 实例。
    猜你喜欢
    • 2020-10-08
    • 2023-04-02
    • 2020-11-26
    • 2011-08-04
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多