繁体   English   中英

如何在 android 工作室的同一或其他表的另一个微调器中添加另一列

[英]how to add another column in another spinner of same or other table in android studio

如何在 sqlite 数据库中使用 android 工作室中的按钮单击在另一个微调器中添加相同或其他表的第二列值

    retrievebtn.setOnClickListener(arg0 -> {

        // TODO Auto-generated method stub
        nos.clear();
        names.clear();

        //OPEN
        db.openDB();

           //RETRIEVE
           Cursor c = db.getAllValues();

        c.moveToFirst();
        while(!c.isAfterLast())
        {
            String no = c.getString(0);
            nos.add(no);
            String name = c.getString(1);
            names.add(name);
            c.moveToNext();
        }

               //CLOSE
               c.close();
               db.close();

               //SET IT TO SPINNER
               sp1.setAdapter(adapter);
               sp2.setAdapter(adapter);


    });

也许考虑以下工作示例。

这包括 2 个微调器和 3 个按钮。 控制从 3 个表中的哪一个表中为第二个微调器提取数据的按钮。

因此,使用的技巧是使用 AS 来利用标准列名,而不考虑实际的列名。 不同之处在于,它不是使用普通适配器,而是使用 CursorAdapter(SimpleCursorAdapter,因为它非常灵活),因此您可以直接提取数据。

首先是 SQLite 端,即扩展 SQLiteOpenHelper 的 class:-

class DBHelper extends SQLiteOpenHelper {
   public static final String DATABASE_NAME = "the_database.db";
   public static final int DATABASE_VERSION = 1;
   public static final String TABLE1_TABLE = "_table1";
   public static final String TABLE1_ID_COL = BaseColumns._ID;
   public static final String TABLE1_NAME_COL = "_name";
   public static final String TABLE1_DESC_COL = "_desc";
   private static final String TABLE1_CREATE_SQL =
           "CREATE TABLE IF NOT EXISTS " + TABLE1_TABLE + "(" +
                   TABLE1_ID_COL + " INTEGER PRIMARY KEY" +
                   "," + TABLE1_NAME_COL + " TEXT UNIQUE" +
                   "," + TABLE1_DESC_COL + " TEXT " +
                   ");";

   public static final String TABLE2_TABLE = "_table2";
   public static final String TABLE2_ID_COL = BaseColumns._ID;
   public static final String TABLE2_TABLE1_ID_MAP_COL = "_table1_id_map";
   public static final String TABLE2_NAME_COL = "_name";
   private static final String TABLE2_CREATE_SQL =
           "CREATE TABLE IF NOT EXISTS " + TABLE2_TABLE + "(" +
                   TABLE2_ID_COL + " INTEGER PRIMARY KEY" +
                   "," + TABLE2_TABLE1_ID_MAP_COL + " INTEGER " +
                   "," + TABLE2_NAME_COL + " TEXT" +
                   ");";

   public static final String TABLE3_TABLE = "_table3";
   public static final String TABLE3_ID_COL = BaseColumns._ID;
   public static final String TABLE3_TABLE2_ID_MAP_COL = "_table2_id_map";
   public static final String TABLE3_NAME_COL = "_name";
   private static final String TABLE3_CREATE_SQL =
           "CREATE TABLE IF NOT EXISTS " + TABLE3_TABLE +"(" +
                   TABLE3_ID_COL + " INTEGER PRIMARY KEY" +
                   "," + TABLE3_TABLE2_ID_MAP_COL + " INTEGER " +
                   "," + TABLE3_NAME_COL + " TEXT " +
                   ");";

   private static volatile DBHelper INSTANCE;
   private SQLiteDatabase db;
   public static final String SPINNER_COLUMN1 = "_spc1";
   public static final String SPINNER_COLUMN2 = "_spc2";

   private DBHelper(Context context) {
      super(context,DATABASE_NAME,null,DATABASE_VERSION);
      db = this.getWritableDatabase();
   }

   public static DBHelper getInstance(Context context) {
      if (INSTANCE==null) {
         INSTANCE = new DBHelper(context);
      }
      return INSTANCE;
   }

   @Override
   public void onCreate(SQLiteDatabase db) {
      db.execSQL(TABLE1_CREATE_SQL);
      db.execSQL(TABLE2_CREATE_SQL);
      db.execSQL(TABLE3_CREATE_SQL);
   }

   @Override
   public void onUpgrade(SQLiteDatabase db, int i, int i1) {

   }

   public long insertTable1Row(String name,String description) {
      ContentValues cv = new ContentValues();
      cv.put(TABLE1_NAME_COL,name);
      cv.put(TABLE1_DESC_COL,description);
      return db.insert(TABLE1_TABLE,null,cv);
   }
   public long insertTable2Row(String name, long table1_id) {
      ContentValues cv = new ContentValues();
      cv.put(TABLE2_NAME_COL,name);
      cv.put(TABLE2_TABLE1_ID_MAP_COL,table1_id);
      return db.insert(TABLE2_TABLE,null,cv);
   }

   public long insertTable3Row(String name, long table2_id) {
      ContentValues cv = new ContentValues();
      cv.put(TABLE3_NAME_COL,name);
      cv.put(TABLE3_TABLE2_ID_MAP_COL,table2_id);
      return db.insert(TABLE3_TABLE,null,cv);
   }

   public Cursor getSpinnerData(String table, long map) {

      String[] columns = new String[]{};
      String whereClause = "";
      String[] whereArgs = new String[]{String.valueOf(map)};
      switch (table) {
         case TABLE1_TABLE:
            columns = new String[]{TABLE1_ID_COL,TABLE1_NAME_COL + " AS " + SPINNER_COLUMN1,TABLE1_DESC_COL + " AS " + SPINNER_COLUMN2};
            whereClause = "";
            break;
         case TABLE2_TABLE:
            columns = new String[]{TABLE2_ID_COL ,TABLE2_NAME_COL + " AS " + SPINNER_COLUMN1,"'-' AS " + SPINNER_COLUMN2};
            whereClause = TABLE2_TABLE1_ID_MAP_COL + "=?";
            break;
         case TABLE3_TABLE:
            columns = new String[]{TABLE3_ID_COL, TABLE3_NAME_COL + " AS " + SPINNER_COLUMN1,"'~' AS " + SPINNER_COLUMN2};
            whereClause = TABLE3_TABLE2_ID_MAP_COL + "=?";
            break;
      }
      if (map < 0) {
         whereClause="";
         whereArgs = new String[]{};
      }
      if (columns.length > 0) {
         return db.query(table,columns,whereClause,whereArgs,null,null,null);
      } else {
         return db.query(TABLE1_TABLE,new String[]{"0 AS " + TABLE1_ID_COL + ",'ooops' AS " + SPINNER_COLUMN1,"'ooops' AS " + SPINNER_COLUMN2},null,null,null,null,null,"1");
      }
   }
}
  • 如前所述,有三张桌子
  • DBHelper 已使用 singleton 方法
  • 与切换微调器数据最相关的方面是getSpinnerData function,它采用两个参数,最相关的是第一个驱动结果查询的表名。
  • 注意BaseColumns._ID ALL Cursor 适配器的使用必须有一个列名_id (这是 BaseColumns._ID 解析的内容)。 该列应该是唯一标识该行的 integer 值。
  • 第二个参数只适合选择相关数据,但使用否定来忽略这方面。

用来演示的Activity“MainActivity”是:-

public class MainActivity extends AppCompatActivity {

    Button btn1, btn2, btn3;
    Spinner sp1,sp2;
    String[] spinnerColumns = new String[]{DBHelper.SPINNER_COLUMN1,DBHelper.SPINNER_COLUMN2};
    SimpleCursorAdapter sca1,sca2;
    String sp1_table_name = DBHelper.TABLE1_TABLE;
    String sp2_table_name = DBHelper.TABLE2_TABLE;
    Cursor csr1, csr2;
    DBHelper dbHelper;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1 = this.findViewById(R.id.button1);
        btn2 = this.findViewById(R.id.button2);
        btn3 = this.findViewById(R.id.button3);
        sp1 = this.findViewById(R.id.spinner1);
        sp2 = this.findViewById(R.id.spinner2);
        dbHelper = DBHelper.getInstance(this);
        Cursor test4Data = dbHelper.getWritableDatabase().query(DBHelper.TABLE1_TABLE,null,null,null,null,null,null, "1");
        if (test4Data.getCount() < 1) {
            addSomeData();
        }
        test4Data.close();
        sp1_table_name = DBHelper.TABLE1_TABLE;
        sp2_table_name = DBHelper.TABLE2_TABLE;
        setUpButtons();
        setOrRefreshSpinner1();
        setOrRefreshSpinner2();
    }

    void setUpButtons() {
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp2_table_name = DBHelper.TABLE1_TABLE;
                setOrRefreshSpinner2();
                setOrRefreshSpinner1();
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp2_table_name = DBHelper.TABLE2_TABLE;
                setOrRefreshSpinner2();
                setOrRefreshSpinner1();
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp2_table_name = DBHelper.TABLE3_TABLE;
                setOrRefreshSpinner2();
                setOrRefreshSpinner1();
            }
        });
    }

    void setOrRefreshSpinner1() {
        csr1 = dbHelper.getSpinnerData(sp1_table_name,-1);
        if (sca1==null) {
            sca1 = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,
                    csr1,
                    spinnerColumns,
                    new int[]{android.R.id.text1, android.R.id.text2},0
            );
            sp1.setAdapter(sca1);
        } else {
            sca1.swapCursor(csr1);
        }
    }
     void setOrRefreshSpinner2() {
        csr2 = dbHelper.getSpinnerData(sp2_table_name,-1);
        if (sca2==null) {
            sca2 = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,
                    csr2,
                    spinnerColumns,
                    new int[]{android.R.id.text1, android.R.id.text2},0
            );
            sp2.setAdapter(sca2);
        } else {
            sca2.swapCursor(csr2);
        }
     }

     private void addSomeData() {
        long n1 = dbHelper.insertTable1Row("NAME001","The first name.");
        long n2 = dbHelper.insertTable1Row("NAME002","The second name.");
        long n3 = dbHelper.insertTable1Row("NAME003","The third name");
        long t2n1 = dbHelper.insertTable2Row("CHILDNAME001",n1);
        long t2n2 = dbHelper.insertTable2Row("CHILDNAME002",n2);
        long t2n3 = dbHelper.insertTable2Row("CHILDNAME003", n3);
        dbHelper.insertTable3Row("GRANDCHILDNAME001",t2n1);
        dbHelper.insertTable3Row("GRANDCHILDNAME002",t2n1);
        dbHelper.insertTable3Row("GRANDCHILDNAME003",t2n1);
        dbHelper.insertTable3Row("GRANDCHILDNAME004",t2n2);
        dbHelper.insertTable3Row("GRANDCHILDNAME005",t2n3);
     }
}

结果运行开始时的上述结果:- 在此处输入图像描述

显示第一个微调器下拉列表:-

在此处输入图像描述

显示第二个微调器下拉列表:- 在此处输入图像描述

如果单击 Button1,则两个微调器(即微调器 2 已更改为表 1 中的 select 数据而不是表 2)显示表 1 中的数据(无用但用于演示):-

在此处输入图像描述

如果单击 Button3,则 Table3 中的数据将显示在第二个微调器中:-

在此处输入图像描述

单击 Button2 显示来自 Table2 的数据。

当然,该原理可以以许多不同的方式应用。

我的适配器未设置,因此我进行了以下更改并获得了预期的结果。

// RETRIEVE
retrievebtn.setOnClickListener(arg0 -> {

        // TODO Auto-generated method stub
        nos.clear();
        names.clear();

        //OPEN
        db.openDB();

           //RETRIEVE
           Cursor c = db.getAllValues();

        c.moveToFirst();
        while(!c.isAfterLast())
        {
            String no = c.getString(0);
            nos.add(no);

            String name = c.getString(1);
            names.add(name);
            c.moveToNext();
        }

               //CLOSE
               c.close();
               db.close();

               //SET IT TO SPINNER
        ArrayAdapter<String> adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, nos);
        ArrayAdapter<String> adapter2 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, names);

        sp1.setAdapter(adapter1);
        sp2.setAdapter(adapter2);
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM