【问题标题】:How to get id from Spinner and it is populated by database如何从 Spinner 获取 id 并由数据库填充
【发布时间】:2015-07-23 21:31:11
【问题描述】:

我通过本地数据库填充Spinner 来创建它。 在我的 DBHelper 中,我使用了 List<String>

public List<String> getServices(){
    List<String> labels = new ArrayList<String>();

    // Select All Query
    String selectQuery = "SELECT  * FROM " + TBL_SERVICES;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }

    // closing connection
    cursor.close();
    db.close();

    // returning lables
    return labels;
}

在我的片段中,我使用它来加载我的微调器

private void loadSpinnerData() {

    initialazeDatabase();

    // Spinner Drop down elements
    List<String> lables = dbHelper.getServices();

    // Creating adapter for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, lables);
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    spn_services.setAdapter(dataAdapter);
}

然后我试图获取它的 ID,但我只从数据库中获取位置而不是 ID

spn_services.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int pos, long id) {
           Log.e(TAG, "My service id is " + pos + "My Id is "+ id);

        }

id 只是返回与 pos 相同的值。如何获取从数据库中保存的 rowID?

**

我的服务表中只有 2 列其 id 和 services_name。

我调试了一下,看到了这个

它只在数据库中获取我的 String 而不是我的 rowID,因为我的数据库看起来像这样

【问题讨论】:

  • 您能发布您的数据库架构吗?了解 TBL_SERVICES 表中的列是有帮助的。
  • @EJK 我的服务表 id 和 services_name 中只有两列
  • 您是否确认您的 getServices() 方法返回的 List 包含预期值?
  • 通过检查我的模拟器显示的内容,它会显示我所有的 services_name。 @EJK
  • 好的,但这不是我要问的。我在询问数组的内容。你能在调试器中查看数组吗?如果没有,您至少可以输入一些 Log 语句来将数组的内容转储到 LogCat 吗?这将有助于确定问题是否出在数据检索中。

标签: android android-spinner


【解决方案1】:

您可以通过更改查询来获取 rowid:

String selectQuery = "SELECT rowid, * FROM " + TBL_SERVICES;

但是问题是你不能使用ArrayAdapter

ArrayAdapter总是使用位置作为 id。由于您从数据库中获取 id,因此正确的解决方案是 CursorAdapter 的子类。在您的情况下,您可以使用SimpleCursorAdapter

所以让我们更改您的 dbHelper getServices() 方法以返回 Cursor

    public Cursor getServicesCursor() {

        // Select All Query
        String selectQuery = "SELECT rowid AS _id, * FROM " + TBL_SERVICES;

        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery(selectQuery, null);
    }

CursorAdapter 的文档说

游标必须包含名为“_id”的列,否则此类将不起作用。

所以我们在查询中将“rowid”重命名为“_id”。

那么就很简单了:

    private void loadSpinnerData() {

        initialazeDatabase();

        // Spinner Drop down cursor
        Cursor servicesCursor = dbHelper.getServicesCursor();

        // map the cursor column names to the TextView ids in the layout
        String[] from = { "services_name" };
        int[] to = { android.R.id.text1 };

        // Creating adapter for spinner
        SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(this, 
              android.R.layout.simple_spinner_dropdown_item,
              servicesCursor, from, to, 0);

        // attaching data adapter to spinner
        spn_services.setAdapter(dataAdapter);
    }

【讨论】:

  • 我是否需要创建自己的适配器来扩展 BaseAdapter?
  • 其实我并没有想到——有一个更简单更明显的解决方案;我更新了我的答案。干杯
  • 这解决了我用他们的 ID 从 DB 填充到 spinner 的所有问题!谢谢你。 =)
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多