2

我正在使用许多 Spinner 供用户输入数据,然后将其保存到 SQLite 数据库中。每个 Spinner 都填充有来自数据库表的数据。

我想控制数据显示的顺序 - 例如,下面是“数量”微调器代码:

//          QUANTITY SPINNER

    Cursor quantityCursor = rmDbHelper.fetchAllQuantities();
    startManagingCursor(quantityCursor);

    // create an array to specify which fields we want to display
    String[] from6 = new String[]{RMDbAdapter.QUANTITY_FORM_TEXT};
    int[] to6 = new int[]{android.R.id.text1};

    // create simple cursor adapter
    SimpleCursorAdapter quantitySpinnerAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, quantityCursor, from6, to6 );

    quantitySpinnerAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
    // get reference to our spinner
    quantitySpinner.setAdapter(quantitySpinnerAdapter);

    if (damagedComponentId > 0) { // Set spinner to saved data

        int spinnerPosition = 0; 

        for (int i = 0; i < quantitySpinner.getCount(); i++)  
        { 
             Cursor cur = (Cursor)(quantitySpinner.getItemAtPosition(i)); 

             //--When your bind you data to the spinner to begin with, whatever columns you 
             //--used you will need to reference it in the cursors getString() method... 

             //--Since "getString()" returns the value of the requested column as a String--  
             //--(In my case) the 4th column of my spinner contained all of my text values  
             //--hence why I set the index of "getString()" method to "getString(3)" 

             int quantitySpinnerItem = cur.getInt(1); 

             if(quantitySpinnerItem == quantitySpinnerData) 
             { 
                //--get the spinner position-- 
                spinnerPosition = i; 
                break; 
              } 
         }       
        quantitySpinner.setSelection(spinnerPosition); 
    }

    else { // Set spinner to default

        int spinnerPosition = 0; 

        for (int i = 0; i < quantitySpinner.getCount(); i++)  
        { 
            Cursor cur = (Cursor)(quantitySpinner.getItemAtPosition(i));

            int quantitySpinnerItem = cur.getInt(1);

            if(quantitySpinnerItem == 1)
            { 
                //--get the spinner position-- 
                spinnerPosition = i;
                break; 
            } 
         }       
        positionSpinner.setSelection(spinnerPosition);
    }

现在这工作正常,除了它将数据排序如下:1、10、11、12、13、14、15、16、17、18、19、2、20、21等。显然我希望它显示1, 2、3等

现在我知道我可以使用“NumberPicker”(而不是 Spinner)或者我可以使用 01、02、03 来绕过默认排序,但是有没有办法改变 Spinner 显示数据的顺序?

我见过两个可能有效的选项(但我看不到在哪里添加到我的代码中):

1) 使用 Collections.sort(SourceArray) ,如下所示:Spinner datasorting in Android。但是,无法使用我的 Spinner 进行这项工作。

或者这个:

2)在查询数据库时设置“order by id”,如下所示:Rearrange list view items in SimpleCursorAdapter。但是看不到你会在哪里做这个..

任何建议都非常感谢..

编辑 - 以下是我的数据库助手类中的代码:

public Cursor fetchAllQuantities() {
    return rmDb.query(QUANTITY_TABLE, new String[] {
            QUANTITY_ID,
            QUANTITY_FORM_TEXT},
            null, null, null, null, QUANTITY_ID);
}

我现在已经包含了 ORDER BY 语句 (QUANTITY_ID),但这对 Spinner 显示数据的顺序没有影响。

编辑 2 - 从头开始​​我的最后一条语句,它已正确排序,但是当第一次创建数据库时,它以默认顺序输入数字。所以下面是我输入数据的地方:

        db.execSQL("INSERT INTO " + QUANTITY_TABLE + "(" + QUANTITY_FORM_TEXT + ")" + 
                " SELECT '1' AS " + QUANTITY_FORM_TEXT +
                " UNION SELECT '2' " +
                " UNION SELECT '3' " +
                " UNION SELECT '4' " +
                " UNION SELECT '5' " +
                " UNION SELECT '6' " +
                " UNION SELECT '7' " +
                " UNION SELECT '8' " +
                " UNION SELECT '9' " +
                " UNION SELECT '10' " +
                " UNION SELECT '11' " +
                " UNION SELECT '12' " +
                " UNION SELECT '13' " +  etc.

但是当我查看 SQLite 程序中的数据库表时,它看起来像这样:

_id | quantity_form_text
 1  |  1
 2  |  10
 3  |  11
 4  |  12
 5  |  13
 6  |  14 etc.

所以我想我现在的问题是你首先如何控制数据进入数据库?

4

1 回答 1

0

好的,所以我似乎已经对其进行了排序。

我有两个微调器:一个是“数量微调器”,它由仅包含数字的数据库表填充(如上所示),另一个是“位置微调器”,它由带有数字 1-20 和文本的表填充。

因此,对于数量 Spinner,我将 Union Select 语句(见上文)更改为 01、02、03(而不是 1、2、3)。由于将其输入到仅接受整数的列中,因此在 onCreate 填充它后,数据库表将显示 1、2、3 等,这就是它在 Spinner 中的显示方式。很好!

由于位置微调器包含文本,因此该列设置为接受文本。同样,Union Select 语句是使用 01、02、03 等编写的,但这在数据库中保持不变(当它填充 Spinner 时,它显示 01、02、03 等 - 这对我的需要很好)。

在这两种情况下,David 和 Mango 建议的解决方案都有效,它现在提取按增量 id 排序的数据,并为数字等提供正确的顺序。

希望这是有道理的!谢谢,戴夫。

于 2012-12-02T19:44:57.957 回答