【问题标题】:Display primary key in the SQlite database when selecting item in Spinner在 Spinner 中选择项目时显示 SQlite 数据库中的主键
【发布时间】:2013-11-06 13:14:30
【问题描述】:

我正在尝试显示我在 Spinner 中选择的项目的主键。我想在 TextView 中显示主键。我将如何执行此操作?我已经知道如何在数据库的表中显示字段。

在我的 DatabseHandler.java 这就是我在表条件中插入数据的方式

public long insertLabelCriteria(String label, String label2, String label3){
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_CRI_NAME, label);
    values.put(KEY_CRI_PER, label2); 
    values.put(KEY_CRI_EVPK, label3);
    // Inserting Row

    long id = db.insert(TABLE_CRITERIA, null, values);
    db.close(); // Closing database connection

    return id;



}

这是我获取标签和返回标签列表的方法

public List<Criteria> getAllLabels( String evpk ){
    List<Criteria> labels = new ArrayList<Criteria>();

    SQLiteDatabase db = this.getReadableDatabase();

   String selectQuery = "SELECT  * FROM " + TABLE_CRITERIA + " WHERE "
         + KEY_CRI_EVPK + " = " + evpk ;



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

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


        } while (cursor.moveToNext());
    }

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

    // returning lables
    return labels;

}

在我的 MainActivity 中

我有一个方法 loadSpinnerData,我每次添加条件时都会使用此方法,它会加载 Spinner 以查看我在数据库中添加的项目

private void loadSpinnerData() {
    // TODO Auto-generated method stub
    // database handler
    DatabaseHandler db = new DatabaseHandler(getApplicationContext());

    // Spinner Drop down elements
    List<Criteria> lables = db.getAllLabels(evpk.getText().toString());

    // Creating adapter for spinner

    ArrayAdapter<Criteria> dataAdapter = new ArrayAdapter<Criteria> (this,
    android.R.layout.simple_spinner_dropdown_item, lables);

    // Drop down layout style - list view with radio button
    dataAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    criteria_spin.setAdapter(dataAdapter);
    criteria_spin.setOnItemSelectedListener(this);
}

现在,在选择项目时,如何在微调器中显示所选项目的主键? 下面这段代码只是为了显示和选择项目点击。

  @Override
   public void onItemSelected(AdapterView<?> parent, View view, int position,
            long id) {
        // On selecting a spinner item
        String label = parent.getItemAtPosition(position).toString();


        // Showing selected spinner item
        Toast.makeText(parent.getContext(), "You selected: " + label,
            Toast.LENGTH_LONG).show();


}

我也尝试添加这段代码,但是id显示的是arraylist编号,而不是主键

 long rowId = id;
 String criteriapk = String.valueOf(label);
 cripk.setText(criteriapk);

我发现很难找到解决方案。我该怎么办?请帮帮我

我也试试这个方法,但是值是cursor。在TextView中,不显示数字。

public Cursor find_id_of_criteria(String label){


SQLiteDatabase db=this.getWritableDatabase(); 
String selectQuery = "SELECT criteria_id FROM Criteria WHERE criteria_name = "+"'" + label +"'";
Cursor id = db.rawQuery(selectQuery, null);


db.close(); 
return  id;

}

我把这个放在 loadSpinnerdata 中

//display id of criteria
        Cursor id2 =      db.find_id_of_criteria(label);
        String cri =(String.valueOf(id2).toString());
        cripk.setText(cri);     

【问题讨论】:

  • 天真的方法是使用所选项目的值查询数据库(假设它是唯一的并且始终返回 1 个项目)并获取主键。最好的方法是实现您的自定义适配器,正如 AlexS 所回答的那样。
  • 我在上面添加了新代码,希望你能帮助我。他们无论如何要将光标转换为长字符串吗?
  • 如果您这样做,请将您的 sn-p //display id of criteria 放入 onItemSelected()。然后使用long id = id2.getLong(0); 获取id。注意setText() 带有数字,因为它会引用字符串资源。
  • 我试过了,它说 TextView 中的 setText 方法不适用于长参数。我现在该怎么办?帮帮我
  • 将其转换为String。你可以像cripk.setText(id+"");cripk.setText(String.valueOf(id)); 那样做。

标签: android sqlite android-spinner


【解决方案1】:

您必须实现自己的适配器扩展 BaseAdapter 或 CursorAdapter 类并使用它来代替 ArrayAdapter。

这是一个使用 CursorAdapter 的示例。我没有测试它,因为它是你自己实现的开始。当然,您也可以使用其他布局,只需对此代码进行一些小改动。

public class CriteriaCursorAdapter extends CursorAdapter {
    private class Holder {
        TextView text;
    }

    private LayoutInflater mInflater;
    public CriteriaCursorAdapter(Context context, Cursor c) {
        super(context, c);
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(
                  android.R.layout.simple_spinner_dropdown_item, parent, false);
        }
        Holder holder = (Holder)convertView.getTag();
        if (holder == null) {
            holder = new Holder();
            holder.text = (TextView)convertView.findViewById(android.R.id.text1);
            convertView.setTag(holder);
        }
        Cursor c = (Cursor)getItem(position);
        holder.text.setText(c.getString(1));
        return convertView;
    }
}

重要提示:如果您使用 CursorAdapter,您的光标必须有一个名为“_id”的列。如果您的 TABLE 不包含此列,您可以通过修改 SELECT 语句来实现此目的!

SELECT columnPK _id, col1, .... FROM ...

要获取主键(光标的“_id”列),您可以使用 CriteriaCursorAdapter 的 long getItemId(int position);

您会发现许多扩展 BaseAdapter 或 CursorAdapter 的示例。 One Example

【讨论】:

  • 你能帮帮我吗?我是新手
  • 我稍后会发布更详细的信息,因为在智能手机上编写代码并不好玩。
  • 我在上面添加了新代码,它有帮助吗?我现在的问题是,它不显示主键,我认为它是相当于光标的主键。无论如何要让它变长或字符串?
【解决方案2】:

简单..您几乎可以回答。按以下方式更改您的getAllLabels

public List<Criteria> getAllLabels( String evpk ){
List<Criteria> labels = new ArrayList<Criteria>();
SQLiteDatabase db = this.getReadableDatabase();
String selectQuery = "SELECT  * FROM " + TABLE_CRITERIA + " WHERE "
     + KEY_CRI_EVPK + " = " + evpk ;
Cursor cursor = db.rawQuery(selectQuery, null);

// looping through all rows and adding to list
if (cursor.moveToFirst()) {
    do {
        Criteria ct = new Criteria();
        ct.setLabel(cursor.getString(1));
        ct.setKey(Integer.parseInt(c.getString(0)));
        labels.add(ct);
    } while (cursor.moveToNext());
}

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

// returning lables
return labels;
}

这里我只更改了 do while 循环。以这种方式为标签和键创建 getter 和 setter。要获取主键,请使用选定的 Criteria 对象,例如ct.getKey;我希望这会对你有所帮助。

更新

List<String> field_key; //accessible in whole class.
private void loadSpinnerData() {
// TODO Auto-generated method stub
// database handler
DatabaseHandler db = new DatabaseHandler(getApplicationContext());

// Spinner Drop down elements
List<Criteria> lables = db.getAllLabels(evpk.getText().toString());
List<String> field_lables = new ArrayList<String>();
field_key = new ArrayList<String>();

// Creating adapter for spinner
for (Criteria ct : lables) {
    field_lables.add(ct.getLabel);
    field_key.add(ct.getkey);
}

ArrayAdapter<String> dataAdapter = new ArrayAdapter<String> (this,
android.R.layout.simple_spinner_dropdown_item, field_lables);

// Drop down layout style - list view with radio button
dataAdapter
        .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

// attaching data adapter to spinner
criteria_spin.setAdapter(dataAdapter);
criteria_spin.setOnItemSelectedListener(this);
}

&

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
        long id) {
    // On selecting a spinner item
    String label = parent.getItemAtPosition(position).toString();
    String key = field_key.get(position).toString();


    // Showing selected spinner item
    Toast.makeText(parent.getContext(), "You selected: " + label+" Your key: " + key,
        Toast.LENGTH_LONG).show();
}

试试这个方法,让我知道会发生什么

【讨论】:

  • ct.getKey 应该放在哪里?我应该在 OnItemSelected 中放什么?请帮帮我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2021-12-30
相关资源
最近更新 更多