第二个Spinner结果基于Sqlite中的First Spinner选择(Magic Code)

时间:2018-01-17 15:45:28

标签: android android-sqlite

我有一个包含两列(id,name)的表。 Toast应该在从spinner中选择id时显示sqlite的“name”细节。

Ex:Sqlite表1,899,Chris和2,890,David。

每当我从微调器中选择值899时,Toast应显示Chris,如果我选择微调器890,则Toast应显示David。需要建议。

代码:SpinnerEx4Activity.Java

package com.bar.example.androidspinnerexample;



import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Toast;
import android.support.v7.app.AppCompatActivity;

import android.database.sqlite.SQLiteDatabase;

import android.widget.Button;
import android.widget.CheckBox;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.SimpleCursorAdapter;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.content.Intent;
import java.util.HashMap;
import java.util.List;
import android.view.View.OnClickListener;
import android.util.Log;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.EditText;
import java.util.LinkedList;
import android.view.inputmethod.InputMethodManager;
public class SpinnerEx4Activity extends Activity implements
    AdapterView.OnItemSelectedListener {
Spinner s1,s2;
Button btnAdd;
EditText inputLabel;
DatabaseHandler dbhndlr;        //<<<<< Single instance for Database handler
Cursor spinner1csr;
Cursor spinner2csr;   //<<<<< Cursor for spinner (close in onDestroy)



 @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spinner_ex4);
        s1 = (Spinner)findViewById(R.id.spinner1);
        s2 = (Spinner)findViewById(R.id.spinner2);
        btnAdd = (Button) findViewById(R.id.btn_add);
        s1.setOnItemSelectedListener(this);
        dbhndlr = new DatabaseHandler(this);    //<<<< Instantiate Databasehandler
        //loadSpinnerData();                            //<<<< commented out


        altLoadSpinnerData();
        altLoadSpinnerData1();//<<<< Load via cursor
        btnAdd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String label = inputLabel.getText().toString();

                if (label.trim().length() > 0) {
                    // database handler commeneted out, use dbhndlr instance instead
                    // inserting new label into database
                    dbhndlr.insertLabel(label);

                    // making input filed text to blank
                    inputLabel.setText("");

                    // Hiding the keyboard
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                    // loading spinner with newly added data
                    //loadSpinnerData();                    //<<<< commeneted out
                    altLoadSpinnerData();
                    altLoadSpinnerData1();
                } else {
                    Toast.makeText(getApplicationContext(), "Please enter label name",
                            Toast.LENGTH_SHORT).show();
                }

            }
        });


    }
    // New method to utilise Cursor adapter
    private void altLoadSpinnerData() {
        spinner1csr = dbhndlr.getAllLabelsAsCursor();
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1, // Layout to show 2 items
                spinner1csr, // Cursor
                new String[]{DatabaseHandler.KEY_NAME},
                new int[]{android.R.id.text1},// Views into which data is shown
                0
        );
              s1.setAdapter(sca);
    }
    private void altLoadSpinnerData1 () {
        // get the cursor
        spinner2csr = dbhndlr.getAllLabelsAsCursor();
        // Instantiaie Simple Cursor Adapter
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_2, // Layout to show 2 items
                spinner2csr, // Cursor
                new String[]{DatabaseHandler.KEY_ID}, // Source data
                new int[]{android.R.id.text2}, // Views into which data is shown
                0
        );
        s2.setAdapter(sca);
        s2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " " +
                                spinner2csr.getString(
                                        spinner2csr.getColumnIndex(DatabaseHandler.KEY_ID)),
                        Toast.LENGTH_SHORT

                ).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub
            }
        });
}}

和Databasehandler.java

package com.bar.example.androidspinnerexample;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "spinnerExample";

    // Labels table name
    private static final String TABLE_LABELS = "labels";

    // Labels Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + TABLE_LABELS + "("
                + KEY_ID + " TEXT," + KEY_NAME + " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);

        // Create tables again
        onCreate(db);
    }

    /**
     * Inserting new lable into lables table
     * */
    public void insertLabel(String label){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, label);

        // Inserting Row
        db.insert(TABLE_LABELS, null, values);
        db.close(); // Closing database connection
    }

    /**
     * Getting all labels
     * returns list of labels
     * */
    public List<String> getAllLabels(){
        List<String> labels = new ArrayList<String>();

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

        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(0));
            } while (cursor.moveToNext());
        }

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

        // returning lables
        return labels;
    }
}

而activity_spinner_ex4.xml是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Label -->

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="8dip"
        android:text="@string/lblAcc" />

    <!-- Spinner Dropdown -->

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dip"
        android:layout_marginRight="8dip"
        android:layout_marginTop="10dip"
         />

    <!-- Select Label -->

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="8dip"
        android:text="@string/lblSubAcc" />

    <!-- Spinner Dropdown -->
    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:layout_marginLeft="8dip"
        android:layout_marginRight="8dip"
        />


    <EditText android:id="@+id/input_label"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dip"
        android:layout_marginRight="8dip"/>

    <!-- Add Button -->
    <Button android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add Label"
        android:layout_marginLeft="8dip"
        android:layout_marginTop="8dip"/>
</LinearLayout>

将微调器和复选框值插入另一个表中。 我能够插入所有数据。但是所有的复选框文本都是保存而不是选中的。你可以帮助。

主要活动。

 btnAdd.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                        //String label = inputLabel.getText().toString();
                    String SaveString="No";

                    DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                    String message1= ((Cursor) s1.getSelectedItem()).getString(2);
                    String message2= ((Cursor) s2.getSelectedItem()).getString(1);
                    String message = inputLabel.getText().toString();
                   // String message1 = s1.getSelectedItem().toString();
                   // String message2 = s2.getSelectedItem().toString();
                    String message10 = s3.getSelectedItem().toString();
                    String message4 = ck1.getText().toString();
                    String message5 = ck2.getText().toString();
                    String message6 = ck3.getText().toString();
                    String message7 = ck4.getText().toString();
                    String message9 = ck6.getText().toString();
                    String message3 = ck7.getText().toString();
                    String message8 = ck8.getText().toString();
                    db.insertLabel(message1,message2,message5,message6,message7,message9,message3,message4,message8,message10);

                    if (ck1.isChecked())
                    { SaveString="Yes";
                    }
                    else
                    {  SaveString="No";
                    }

                    if (ck2.isChecked())
                    { SaveString="Yes";
                    }
                    else
                    {  SaveString="No";
                    }

                    if (message.trim().length() > 0) {
                        // database handler commeneted out, use dbhndlr instance instead
                        // inserting new label into database


                        // making input filed text to blank
                        inputLabel.setText("");

                        // Hiding the keyboard
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                        // loading spinner with newly added data
                        spinner1csr = dbhndlr.getAllLabelsAsCursor();
                        spinner2csr = dbhndlr.getByRowid(spinner1_selected);
                        sca.swapCursor(spinner1csr);
                        sca2.swapCursor(spinner2csr);
                    } else {
                        Toast.makeText(getApplicationContext(), "Please enter label name",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }

数据库。

     public void insertLabel(String message1, String message2,String message3,String message4,String message5,String message6,String message7,String message8,String message9,String message10){
            SQLiteDatabase db = this.getWritableDatabase();

            ContentValues values = new ContentValues();

            values.put(KEY_1, message1);
            values.put(KEY_2, message2);
            values.put(KEY_10,message10);
            values.put(KEY_3,message3);
            values.put(KEY_4,message4);
            values.put(KEY_5,message5);
            values.put(KEY_6,message6);
            values.put(KEY_7,message7);
            values.put(KEY_9,message9);

            values.put(KEY_8,message8);


            // Inserting Row
            db.insert(TABLE_LABELS2, null, values);
            db.close(); // Closing database connection
        }

3 个答案:

答案 0 :(得分:1)

替代/改进SpinnerEx4Activity.Java

public class SpinnerEx4Activity extends Activity {
    Spinner s1,s2;
    Button btnAdd;
    EditText inputLabel;
    DatabaseHandler dbhndlr;
    Cursor spinner1csr, spinner2csr;
    SimpleCursorAdapter sca, sca2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        s1 = (Spinner)findViewById(R.id.spinner1);
        s2 = (Spinner)findViewById(R.id.spinner2);
        btnAdd = (Button) findViewById(R.id.btn_add);
        inputLabel = (EditText) findViewById(R.id.input_label);
        dbhndlr = new DatabaseHandler(this);

        // If no data in database then load data for testing purposes only
        if (DatabaseUtils.queryNumEntries(
                dbhndlr.getWritableDatabase(),
                DatabaseHandler.TABLE_LABELS) < 1)
        {
            dbhndlr.insertlabel("899","Chris");
            dbhndlr.insertlabel("890","David");
        }

        // Get Cursors for Spinners
        spinner1csr = dbhndlr.getAllLabelsAsCursor();
        spinner2csr = dbhndlr.getAllLabelsAsCursor();

        //Setup Adapter for Spinner 1
        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,spinner1csr,
                new String[]{DatabaseHandler.KEY_ID},
                new int[]{android.R.id.text1},
                0
        );
        //Steup Adapter for Spinner2
        sca2 = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                spinner2csr,
                new String[]{DatabaseHandler.KEY_NAME},
                new int[]{android.R.id.text1},
                0
        );
        // Set the Adapters to the Spinners
        s1.setAdapter(sca);
        s2.setAdapter(sca2);
        // Set Spinner1 OnSelectedItemListener
        s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " - " +
                                spinner1csr.getString(
                                        spinner1csr.getColumnIndex(DatabaseHandler.KEY_NAME)),
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        // Set Spinner2 OnSelectedItemListener
        s2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " " +
                                spinner2csr.getString(
                                        spinner2csr.getColumnIndex(DatabaseHandler.KEY_ID)),
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        btnAdd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String label = inputLabel.getText().toString();

                if (label.trim().length() > 0) {
                    // database handler commeneted out, use dbhndlr instance instead
                    // inserting new label into database
                    dbhndlr.insertLabel(label);

                    // making input filed text to blank
                    inputLabel.setText("");

                    // Hiding the keyboard
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                    // loading spinner with newly added data
                    //loadSpinnerData();                    //<<<< commeneted out
                    spinner1csr = dbhndlr.getAllLabelsAsCursor();
                    spinner2csr = dbhndlr.getAllLabelsAsCursor();
                    sca.swapCursor(spinner1csr);
                    sca2.swapCursor(spinner2csr);
                    //altLoadSpinnerData();
                    //altLoadSpinner2Data();
                } else {
                    Toast.makeText(getApplicationContext(), "Please enter label name",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

注释

  • 不再实现AdapterView.OnItemSelectedListener
  • 不再创建新的适配器实例重用现有适配器
  • 由于上述原因,使用adapter.swapCursor(new_cursor)使微调器与输入的数据保持同步。
  • 第一个微调器将显示空行,第二个将导致Toast显示id,后跟bu null。
    • 上述两种情况都是因为在输入新标签时,未分配ID(不是 rowid )。由于仅添加'dbhndlr.insertLabel(label);'因此KEY_ID列为空。我不知道你如何将ID分配给标签(名称)。但是,请注意我是如何创建一个采用ID和NAME / LABEL参数的替代insertlabel方法。

根据评论修改

  

这里我现在谈论选择微调器s1值(例如:123)然后   旋转器s2应该按照表格的不同值(Mike Trae)。

即。微调器应该排除其他微调器中的选定值(微调器是相互依赖的)

  • 注意!我改为在两个微调器中显示名称,因为id可以为空并且令人困惑(参见前面的注释)

SpinnerEx4Activity

public class SpinnerEx4Activity extends Activity {
    Spinner s1,s2;
    Button btnAdd;
    EditText inputLabel;
    DatabaseHandler dbhndlr;
    Cursor spinner1csr, spinner2csr;
    SimpleCursorAdapter sca, sca2;
    long spinner1_selected = 0, spinner2_selected = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        s1 = (Spinner)findViewById(R.id.spinner1);
        s2 = (Spinner)findViewById(R.id.spinner2);
        btnAdd = (Button) findViewById(R.id.btn_add);
        inputLabel = (EditText) findViewById(R.id.input_label);
        dbhndlr = new DatabaseHandler(this);

        // If no data in database then load data for testing purposes only
        if (DatabaseUtils.queryNumEntries(
                dbhndlr.getWritableDatabase(),
                DatabaseHandler.TABLE_LABELS) < 1)
        {
            dbhndlr.insertlabel("899","Chris");
            dbhndlr.insertlabel("890","David");
        }

        // Get Cursors for Spinners
        spinner1csr = dbhndlr.getAllLabelsExceptedSelected(spinner2_selected);
        //Setup Adapter for Spinner 1
        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,spinner1csr,
                new String[]{DatabaseHandler.KEY_NAME},
                new int[]{android.R.id.text1},
                0
        );

        // Set the Adapters to the Spinners
        s1.setAdapter(sca);
        // Set Spinner1 OnSelectedItemListener
        s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " - " +
                                spinner1csr.getString(
                                        spinner1csr.getColumnIndex(DatabaseHandler.KEY_NAME)) +
                                " - " + spinner1csr.getString(spinner1csr.getColumnIndex(DatabaseHandler.KEY_ID))
                        ,
                        Toast.LENGTH_SHORT).show();
                spinner1_selected = id;
                spinner2csr = dbhndlr.getAllLabelsExceptedSelected(spinner1_selected);
                sca2.swapCursor(spinner2csr);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        //Steup Adapter for Spinner2
        spinner2csr = dbhndlr.getAllLabelsExceptedSelected(spinner1_selected);
        sca2 = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                spinner2csr,
                new String[]{DatabaseHandler.KEY_NAME},
                new int[]{android.R.id.text1},
                0
        );
        s2.setAdapter(sca2);
        // Set Spinner2 OnSelectedItemListener
        s2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " - " +
                                spinner2csr.getString(
                                        spinner2csr.getColumnIndex(DatabaseHandler.KEY_NAME)) +
                                " - " + spinner2csr.getString(spinner2csr.getColumnIndex(DatabaseHandler.KEY_ID)),
                        Toast.LENGTH_SHORT).show();
                spinner2_selected = id;
                spinner1csr = dbhndlr.getAllLabelsExceptedSelected(spinner2_selected);
                sca.swapCursor(spinner1csr);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        btnAdd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String label = inputLabel.getText().toString();

                if (label.trim().length() > 0) {
                    // database handler commeneted out, use dbhndlr instance instead
                    // inserting new label into database
                    dbhndlr.insertLabel(label);

                    // making input filed text to blank
                    inputLabel.setText("");

                    // Hiding the keyboard
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                    // loading spinner with newly added data
                    //loadSpinnerData();                    //<<<< commeneted out
                    spinner1csr = dbhndlr.getAllLabelsExceptedSelected(spinner2_selected);
                    spinner2csr = dbhndlr.getAllLabelsExceptedSelected(spinner1_selected);
                    sca.swapCursor(spinner1csr);
                    sca2.swapCursor(spinner2csr);
                    //altLoadSpinnerData();
                    //altLoadSpinner2Data();
                } else {
                    Toast.makeText(getApplicationContext(), "Please enter label name",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    public void onDestroy() {
        spinner1csr.close();
        spinner2csr.close();
        super.onDestroy();
    }
}

数据库处理器

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    public static final String DATABASE_NAME = "spinnerExample";

    // Labels table name
    public static final String TABLE_LABELS = "labels"; //<<<< Made public

    // Labels Table Columns names
    public static final String KEY_ID = "id";           //<<<< Made public
    public static final String KEY_NAME = "name";       //<<<< made public

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + TABLE_LABELS + "("
                + KEY_ID + " TEXT," + KEY_NAME + " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);

        // Create tables again
        onCreate(db);
    }

    /**
     * Inserting new lable into lables table
     * */
    public void insertLabel(String label){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, label);

        // Inserting Row
        db.insert(TABLE_LABELS, null, values);
        db.close(); // Closing database connection
    }

    // Added for adding new data
    public void insertlabel(String id, String label) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(KEY_ID,id);
        cv.put(KEY_NAME,label);
        db.insert(TABLE_LABELS,null,cv);
        db.close();
    }

    // Added to get Cursor for Simple CursorAdapter
    public Cursor getAllLabelsAsCursor() {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(TABLE_LABELS,columns,null,null,null,null,null);
    }

    public Cursor getAllLabelsExceptedSelected(long selected) {
        String[] columns = new String[]{"rowid AS _id, *"};
        String whereclause = "rowid <> ?";
        String[] whereargs = new String[]{String.valueOf(selected)};
        return this.getWritableDatabase().query(TABLE_LABELS,
                columns,
                whereclause,
                whereargs,
                null,
                null,
                null
        );
    }
}

评论后的修正案: -

  

但我想首先只选择单向Spinner1   column(Database)应显示在微调器2(第二列)数据库中。

     

不需要从旋转器2到旋转器。

     

1.另请注意,我的表有1000个数据*(行)*。

     

ex:数据库:   { dbhndlr.insertlabel("9001234","Chris") dbhndlr.insertlabel("9001235","Cdedd"); dbhndlr.insertlabel("9003457","Dcdtt"); dbhndlr.insertlabel("9001231","Chrdis"); dbhndlr.insertlabel("9003451","Ddavid");}

     

例如:如果微调器1选择9001231,则微调器2应显示Chrdis,如果微调器1选择9001234,则spinner2应显示Chris。

1)向 Databasehandler.java 添加了新方法getByRowid: -

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    public static final int DATABASE_VERSION = 1;

    // Database Name
    public static final String DATABASE_NAME = "spinnerExample";

    // Labels table name
    public static final String TABLE_LABELS = "labels"; //<<<< Made public

    // Labels Table Columns names
    public static final String KEY_ID = "id";           //<<<< Made public
    public static final String KEY_NAME = "name";       //<<<< made public

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + TABLE_LABELS + "("
                + KEY_ID + " TEXT," + KEY_NAME + " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);

        // Create tables again
        onCreate(db);
    }

    /**
     * Inserting new lable into lables table
     * */
    public void insertLabel(String label){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, label);

        // Inserting Row
        db.insert(TABLE_LABELS, null, values);
        db.close(); // Closing database connection
    }

    // Added for adding new data
    public void insertlabel(String id, String label) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(KEY_ID,id);
        cv.put(KEY_NAME,label);
        db.insert(TABLE_LABELS,null,cv);
        db.close();
    }

    // Added to get Cursor for Simple CursorAdapter
    public Cursor getAllLabelsAsCursor() {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(TABLE_LABELS,columns,null,null,null,null,null);
    }

    public Cursor getAllLabelsExceptedSelected(long selected) {
        String[] columns = new String[]{"rowid AS _id, *"};
        String whereclause = "rowid <> ?";
        String[] whereargs = new String[]{String.valueOf(selected)};
        return this.getWritableDatabase().query(TABLE_LABELS,
                columns,
                whereclause,
                whereargs,
                null,
                null,
                null
        );
    }

    public Cursor getByRowid(long id) {
        String[] columns = new String[]{"rowid AS _id, *"};
        return this.getWritableDatabase().query(
                TABLE_LABELS,
                columns,
                "rowid=?",
                new String[]{String.valueOf(id)},
                null,null,null
        );
    }
}

修订后的 SpinnerEx4Acitivity.java : -

public class MainActivity extends Activity {
    Spinner s1,s2;
    Button btnAdd;
    EditText inputLabel;
    DatabaseHandler dbhndlr;
    Cursor spinner1csr, spinner2csr;
    SimpleCursorAdapter sca, sca2;
    long spinner1_selected = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        s1 = (Spinner)findViewById(R.id.spinner1);
        s2 = (Spinner)findViewById(R.id.spinner2);
        btnAdd = (Button) findViewById(R.id.btn_add);
        inputLabel = (EditText) findViewById(R.id.input_label);
        dbhndlr = new DatabaseHandler(this);

        // If no data in database then load data for testing purposes only
        if (DatabaseUtils.queryNumEntries(
                dbhndlr.getWritableDatabase(),
                DatabaseHandler.TABLE_LABELS) < 1)
        {
            dbhndlr.insertlabel("899","Chris");
            dbhndlr.insertlabel("890","David");
        }

        // Get Cursors for Spinners
        spinner1csr = dbhndlr.getAllLabelsAsCursor();
        //Setup Adapter for Spinner 1
        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,spinner1csr,
                new String[]{DatabaseHandler.KEY_ID},
                new int[]{android.R.id.text1},
                0
        );

        // Set the Adapters to the Spinners
        s1.setAdapter(sca);
        // Set Spinner1 OnSelectedItemListener
        s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " - " +
                                spinner1csr.getString(
                                        spinner1csr.getColumnIndex(DatabaseHandler.KEY_NAME)) +
                                " - " + spinner1csr.getString(spinner1csr.getColumnIndex(DatabaseHandler.KEY_ID))
                        ,
                        Toast.LENGTH_SHORT).show();
                spinner1_selected = id;
                spinner2csr = dbhndlr.getByRowid(spinner1_selected);
                sca2.swapCursor(spinner2csr);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        //Steup Adapter for Spinner2
        spinner2csr = dbhndlr.getByRowid(spinner1_selected);
        sca2 = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                spinner2csr,
                new String[]{DatabaseHandler.KEY_NAME},
                new int[]{android.R.id.text1},
                0
        );
        s2.setAdapter(sca2);
        // Set Spinner2 OnSelectedItemListener
        /* Not needed
        s2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(parent.getContext(),
                        "You Selected: " + id + " - " +
                                spinner2csr.getString(
                                        spinner2csr.getColumnIndex(DatabaseHandler.KEY_NAME)) +
                                " - " + spinner2csr.getString(spinner2csr.getColumnIndex(DatabaseHandler.KEY_ID)),
                        Toast.LENGTH_SHORT).show();
                spinner2_selected = id;
                spinner1csr = dbhndlr.getAllLabelsExceptedSelected(spinner2_selected);
                sca.swapCursor(spinner1csr);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        */
        btnAdd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String label = inputLabel.getText().toString();

                if (label.trim().length() > 0) {
                    // database handler commeneted out, use dbhndlr instance instead
                    // inserting new label into database
                    dbhndlr.insertLabel(label);

                    // making input filed text to blank
                    inputLabel.setText("");

                    // Hiding the keyboard
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                    // loading spinner with newly added data
                    spinner1csr = dbhndlr.getAllLabelsAsCursor();
                    spinner2csr = dbhndlr.getByRowid(spinner1_selected);
                    sca.swapCursor(spinner1csr);
                    sca2.swapCursor(spinner2csr);
                } else {
                    Toast.makeText(getApplicationContext(), "Please enter label name",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    public void onDestroy() {
        spinner1csr.close();
        spinner2csr.close();
        super.onDestroy();
    }
}

答案 1 :(得分:0)

您应该包含一种方法来获取一个Label。

public String getLabelsById(int id){ 
 String result = null;

    // Select Query
    String selectQuery = "SELECT  * FROM " + TABLE_LABELS + " WHERE " + "id" +" = ?";

    SQLiteDatabase db = this.getReadableDatabase();
    cursor = db.rawQuery(selectQuery, new String[] {String.valueOf(id)});

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {

            result = (cursor.getString(0));
    }

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

    // returning lables
    return labels;
}

您应该创建一个用于存储用户的类,其中包含两个属性:名称和编号。然后你应该修改这个函数,如:

 User user = new User();

然后,返回一个字符串:

 user.setName(cursor.getString(1));
 user.setNumber(cursor.getString(2));

答案 2 :(得分:0)

有几种方法可以实现这一目标。

最容易实现的是将另一个方法(例如getNameById)添加到 Databasehandler.java ,它将从标签表中返回名称,然后在Spinner中调用它&# 39; s覆盖onItemSelected方法。     public String getNameById(String id){         String rv =&#34;找不到名字&#34 ;;         SQLiteDatabase db = this.getReadableDatabase();         游标csr = db.query(TABLE_LABELS,                 空值,                 KEY_ID +&#34; =?&#34;,                 new String [] {id},                 NULL,NULL,NULL,NULL         );

    if (csr.moveToFirst()) {
        rv = csr.getString(csr.getColumnIndex(KEY_NAME));
    }
    csr.close();
    db.close();
    return rv;
}
  • 这假设id将是unqiue
  • 使用getColumnIndex(column_name)比使用硬编码列偏移更灵活,更不可能导致错误。

SpinnerEx4Activity.Java 中的重写onItemSelected方法可以是: -

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

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

替代方法 - 使用光标适配器

另一种方法是使用CursorAdapter(SimpleCursorAdapter),然后允许直接访问所有列。

1)这需要 DatabaseHandler.java 中返回游标的方法。注意到必须存在名为 _id 的列。由于未使用WITHOUT ROWID关键字定义表,因此存在名为 rowid 的列(通常不可见)。因此,我们可以使用rowid AS _id来获取此信息。以下内容可以添加到 DatabaseHandler.java (请注意其他更改,请参阅下面的完整 DatabaseHandler.java 。)

// Added to get Cursor for Simple CursorAdapter
public Cursor getAllLabelsAsCursor() {
    String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
    return this.getWritableDatabase().query(TABLE_LABELS,columns,null,null,null,null,null);
}

2)在Spinner活动中调用新方法getAllLabelsAsCursor来检索光标。 (见下文)

3)替换使用SimpleCursorAdapter的loadSpinner方法。

除了上述内容之外,还进行了一些更改(请参阅//&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

完整的工作代码是: -

Databasehandler.java

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "spinnerExample";

    // Labels table name
    public static final String TABLE_LABELS = "labels"; //<<<< Made public

    // Labels Table Columns names
    public static final String KEY_ID = "id";           //<<<< Made public
    public static final String KEY_NAME = "name";       //<<<< made public

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + TABLE_LABELS + "("
                + KEY_ID + " TEXT," + KEY_NAME + " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);

        // Create tables again
        onCreate(db);
    }

    /**
     * Inserting new lable into lables table
     * */
    public void insertLabel(String label){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, label);

        // Inserting Row
        db.insert(TABLE_LABELS, null, values);
        db.close(); // Closing database connection
    }

    //<<<< Added for adding new data for testing
    public void insertlabel(String id, String label) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(KEY_ID,id);
        cv.put(KEY_NAME,label);
        db.insert(TABLE_LABELS,null,cv);
        db.close();
    }

    /**
     * Getting all labels
     * returns list of labels
     * */
    public List<String> getAllLabels(){
        List<String> labels = new ArrayList<String>();

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

        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(0));
            } while (cursor.moveToNext());
        }

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

        // returning lables
        return labels;
    }

    // Added to get Cursor for Simple CursorAdapter
    public Cursor getAllLabelsAsCursor() {
        String[] columns = new String[]{"rowid AS _id, *"}; // Need _id column for SimpleCursorAdapter
        return this.getWritableDatabase().query(TABLE_LABELS,columns,null,null,null,null,null);
    }
}

SpinnerEx4Activity.Java

public class SpinnerEx4Activity extends Activity implements
        AdapterView.OnItemSelectedListener {
    Spinner s1,s2;
    Button btnAdd;
    EditText inputLabel;
    DatabaseHandler dbhndlr;        //<<<<< Single instance for Database handler
    Cursor spinner1csr;             //<<<<< Cursor for spinner (close in onDestroy)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        s1 = (Spinner)findViewById(R.id.spinner1);
        s2 = (Spinner)findViewById(R.id.spinner2);
        btnAdd = (Button) findViewById(R.id.btn_add);
        inputLabel = (EditText) findViewById(R.id.input_label);
        s1.setOnItemSelectedListener(this);
        dbhndlr = new DatabaseHandler(this);    //<<<< Instantiate Databasehandler
        //loadSpinnerData();                            //<<<< commented out

        // If no data in database then load data
        if (DatabaseUtils.queryNumEntries(dbhndlr.getWritableDatabase(),DatabaseHandler.TABLE_LABELS) < 1) {
            dbhndlr.insertlabel("899","Chris");
            dbhndlr.insertlabel("890","David");
        }
        altLoadSpinnerData();                           //<<<< Load via cursor
        btnAdd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String label = inputLabel.getText().toString();

                if (label.trim().length() > 0) {
                    // database handler commeneted out, use dbhndlr instance instead
                    // inserting new label into database
                    dbhndlr.insertLabel(label);

                    // making input filed text to blank
                    inputLabel.setText("");

                    // Hiding the keyboard
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(inputLabel.getWindowToken(), 0);

                    // loading spinner with newly added data
                    //loadSpinnerData();                    //<<<< commeneted out
                    altLoadSpinnerData();
                } else {
                    Toast.makeText(getApplicationContext(), "Please enter label name",
                            Toast.LENGTH_SHORT).show();
                }

            }
        });


    }
    // New method to utilise Cursor adapter
    private void altLoadSpinnerData() {
        // get the cursor
        spinner1csr = dbhndlr.getAllLabelsAsCursor();
        // Instantiaie Simple Cursor Adapter
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_2, // Layout to show 2 items
                spinner1csr, // Cursor
                new String[]{DatabaseHandler.KEY_ID,DatabaseHandler.KEY_NAME}, // Source data
                new int[]{android.R.id.text1,android.R.id.text2}, // Views into which data is shown
                0
        );
        //
        //sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s1.setAdapter(sca);
}


    private void loadSpinnerData() {
        // Spinner Drop down elements
        List<String> lables = dbhndlr.getAllLabels();

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_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
        s1.setAdapter(dataAdapter);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // Note id will be the same as position for ArrayAdapter but for CursorAdapter
        // will be the _id column (in this case rowid)
        // On selecting a spinner item
        //String label = parent.getItemAtPosition(arg2).toString(); //<<<< no need

        // Showing selected spinner item
        Toast.makeText(parent.getContext(),
                "You selected: " + id +
                        " " +
                        spinner1csr.getString(
                                spinner1csr.getColumnIndex(
                                        DatabaseHandler.KEY_NAME)
                        ) ,
                Toast.LENGTH_LONG).show();

    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }
}

注释

  • 以上内容包括检查无数据并加载上述两行。
  • 使表名和列名公开允许访问它们(更好地使用列名而不是游标get ????方法的偏移量。)
  • 代码已更改为使用DatabaseHandler的单个实例,替换了DatabaseHandler db = new DatabaseHandler(getApplicationContext());的多个实例的创建
  • 应关闭Cursor,覆盖onDestroy方法。但是,您不需要关闭数据库本身,尽管如此。
  • Spinner在所选视图和下拉视图中显示两个项目(注释掉setDropdownViewresource,您可能希望进行实验,或许提供您自己的布局)。

屏幕截图示例: -

enter image description here

enter image description here

  • 注意标签(LabelAcc和LabelSubACc)是这样的,因为我用文本覆盖了String资源,而不是猜测String资源的值。

编辑重新评论

  

Spinner1只能工作.spinner 2没有反应。

1)添加新方法(可能在一种方法中,但可能最好将它们分开。如果在一种方法中则不需要3): -

// New method to utilise Cursor adapter for 2nd Spinner
private void altLoadSpinner2Data() {
    // get the cursor
    spinner2csr = dbhndlr.getAllLabelsAsCursor();
    // Instantiaie Simple Cursor Adapter
    SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1, // Layout to show 2 items
            spinner2csr, // Cursor
            new String[]{DatabaseHandler.KEY_NAME}, // Source data
            new int[]{android.R.id.text1}, // Views into which data is shown
            0
    );
    //
    //sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s2.setAdapter(sca);
    s2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(parent.getContext(),
                    "You Selected: " + id + " " +
                    spinner2csr.getString(
                            spinner2csr.getColumnIndex(DatabaseHandler.KEY_ID)),
                    Toast.LENGTH_SHORT

            ).show();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
}
  • 注意使用第二个光标,因此每个光标都可以有自己的位置
  • 包含它自己略有不同(显示的ID已被选中)OnSelectedItemListener

2)将光标声明更改为2光标,使其为: -

    Cursor spinner1csr, spinner2csr;             //<<<<< Cursor for spinner (close in onDestroy)

3)按照以下方式在第1个之后/之前添加调用以加载第2个微调器: -

    altLoadSpinner2Data();
  • 请注意,这个第二个旋转器不会有任何实际用途,因为它只是复制了第一个显示该行的不同方式。
  • 请注意,您必须小心使用微调器,默认情况下,默认情况下将调用OnSelectedItemListener。例如How to keep onItemSelected from firing off on a newly instantiated Spinner? 启动应用程序,不执行任何操作并观看Toasts