简体   繁体   English

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

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

how to add second column value of same or other table in another spinner from sqlite database using button click 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);


    });

Perhaps consider the following working example.也许考虑以下工作示例。

This consists of 2 spinners and 3 buttons.这包括 2 个微调器和 3 个按钮。 The buttons controlling from which of the 3 tables the data is extracted for the 2nd spinner.控制从 3 个表中的哪一个表中为第二个微调器提取数据的按钮。

The trick, as such, used is to use AS to utilise a standard column name, irrespective of the actual column name.因此,使用的技巧是使用 AS 来利用标准列名,而不考虑实际的列名。 The one difference is that this rather than using a normal adapter, it utilises a CursorAdapter (SimpleCursorAdapter as it's quite flexible) and thus you can extract the data directly.不同之处在于,它不是使用普通适配器,而是使用 CursorAdapter(SimpleCursorAdapter,因为它非常灵活),因此您可以直接提取数据。

First the SQLite side ie the class that extends SQLiteOpenHelper:-首先是 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");
      }
   }
}
  • as said there are three tables如前所述,有三张桌子
  • a singleton approach has been utilised for the DBHelper DBHelper 已使用 singleton 方法
  • the most relevant aspect in regards to switching spinner data is the getSpinnerData function, which takes two parameters, the most relevant being the first the tablename which drives the resultant query.与切换微调器数据最相关的方面是getSpinnerData function,它采用两个参数,最相关的是第一个驱动结果查询的表名。
  • Note the use of BaseColumns._ID ALL Cursor adapters must have a column name _id (which is what BaseColumns._ID resolves to).注意BaseColumns._ID ALL Cursor 适配器的使用必须有一个列名_id (这是 BaseColumns._ID 解析的内容)。 The column should be an integer value that uniquely identifies the row.该列应该是唯一标识该行的 integer 值。
  • the 2nd parameter caters for the selection of only related data, but a negative is used to ignore this aspect.第二个参数只适合选择相关数据,但使用否定来忽略这方面。

The Activity "MainActivity" used to demonstrate is:-用来演示的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);
     }
}

Result The above when run starts of with:-结果运行开始时的上述结果:- 在此处输入图像描述

With the first spinner dropdown shown:-显示第一个微调器下拉列表:-

在此处输入图像描述

With the second spinner dropdown shown:-显示第二个微调器下拉列表:- 在此处输入图像描述

If Button1 is clicked then both spinners (ie spinner2 has been changed to select data from Table1 rather than Table2) show data from Table1 (useless but for demonstration):-如果单击 Button1,则两个微调器(即微调器 2 已更改为表 1 中的 select 数据而不是表 2)显示表 1 中的数据(无用但用于演示):-

在此处输入图像描述

If Button3 is clicked then data from Table3 is displayed in the second spinner:-如果单击 Button3,则 Table3 中的数据将显示在第二个微调器中:-

在此处输入图像描述

Clicking Button2 shows data from Table2.单击 Button2 显示来自 Table2 的数据。

Of course the principle could be applied in many different ways.当然,该原理可以以许多不同的方式应用。

My adapters were not set so I made below changes and got expected result.我的适配器未设置,因此我进行了以下更改并获得了预期的结果。

// 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.

相关问题 Android Studio-如何在服务中将微调框添加到popupwindow - android studio - how to add spinner to popupwindow in service 如何添加约束以检查同一个表中的另一列中是否存在值? - How do I add a constraint to check if value is present in another column within the same table? 仅当使用Sqlite数据库选中复选框时,如何才能将数据添加到另一个表中?-Android Studio - How To Add data to another table only if a checkbox is checked using Sqlite database?- android studio Android Studio:如何从活动获取用户输入(从微调器和编辑文本)到另一个活动? - Android Studio: How do I get user input (From Spinner and Edit Text) from activity to another activity? 如何向预制的android程序中添加另一个按钮(Android Studio) - how to add another button to a premade android program (Android Studio) Android:Spinner onItemSelect给另一个Spinner充气 - Android: Spinner onItemSelect inflate another Spinner Android Spinner选择会禁用另一个Spinner中的选择 - Android Spinner selection disables selections in another spinner 如果已经由另一个微调器选择了项目,如何不显示要由其他微调器选择的项目 - how to not show item for selection by other spinner, if it has already been selected by another spinner 如何使一个微调框填充另一个微调框? - How to make a spinner populate another spinner? 如何从另一个微调器禁用微调器? - How disable spinner from another spinner?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM