Вот простой полный рабочий пример: -
Помощник по базам данных DBHelper.java
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSON = 1;
public static final String TBL_MYTABLE = "mytable";
public static final String COl_MYTABLE_ID = BaseColumns._ID;
public static final String COl_MYTABLE_NAME = "name";
public static final String COl_MYTABLE_LASTNAME = "lastname";
public DBHelper(@Nullable Context context) {
super(context, DBNAME, null, DBVERSON);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TBL_MYTABLE +
"(" +
COl_MYTABLE_ID + " INTEGER PRIMARY KEY," +
COl_MYTABLE_NAME + " TEXT," +
COl_MYTABLE_LASTNAME + " TEXT" +
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long addRow(String name, String lastname) {
ContentValues cv = new ContentValues();
cv.put(COl_MYTABLE_NAME,name);
cv.put(COl_MYTABLE_LASTNAME,lastname);
SQLiteDatabase db = this.getWritableDatabase();
return db.insert(TBL_MYTABLE,null,cv);
}
public ArrayList<String> getRows(String NameFilter, boolean return__name) {
ArrayList<String> rv = new ArrayList<>();
String whereclause = null;
String[] whereargs = null;
String groupby = null;
if (NameFilter != null && NameFilter.length() > 0) {
whereclause = COl_MYTABLE_NAME + "=?";
whereargs = new String[]{NameFilter};
}
if (return__name) {
groupby = COl_MYTABLE_NAME;
}
SQLiteDatabase db = this.getWritableDatabase();
Cursor csr = db.query(TBL_MYTABLE,null,whereclause,whereargs,groupby,null,COl_MYTABLE_NAME);
while (csr.moveToNext()) {
if (return__name) {
rv.add(csr.getString(csr.getColumnIndex(COl_MYTABLE_NAME)));
} else {
rv.add(csr.getString(csr.getColumnIndex(COl_MYTABLE_LASTNAME)));
}
}
csr.close();
return rv;
}
}
- Метод getRows принимает два параметра
- первая строка с именем, которое будет выбрано "" или равно нулю, чтобы получить все.
- второй, логический, указывает, следует ли возвращать имя (true), кроме фамилии (false).
- второй дополнительно, если true, вводит
GROUP BY name
, поэтому повторяющиеся имена не перечислены.
Активность MainActivity.java
public class MainActivity extends AppCompatActivity {
Spinner mNameSpinner, mLastNameSpinner;
ArrayAdapter<String> mNameAdapter, mLastNameAdapter;
ArrayList<String> mNameList, mLastNameList;
DBHelper mDBHlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNameSpinner = this.findViewById(R.id.namespinner);
mLastNameSpinner = this.findViewById(R.id.lastnamespinner);
mDBHlpr = new DBHelper(this);
addSomeTestingData(); //Add some data
manageNameSpinner(); //Manage the Name Spinner (which will manage the Lastname Spinner)
}
//Manage the Name Spinner - Called every-time the Spinner needs to be displayed or re-displayed
private void manageNameSpinner() {
mNameList = mDBHlpr.getRows(null, true);
if (mNameAdapter == null) {
mNameAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,mNameList);
mNameSpinner.setAdapter(mNameAdapter);
//NOTE if a selection is made then the LastName Spinner is managed
mNameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
manageLastNameSpinner();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
} else {
mNameAdapter.clear();
mNameAdapter.addAll(mNameList);
mNameAdapter.notifyDataSetChanged();
}
}
//Manage the LastName Spinner - Called every-time the Spinner needs to be displayed or re-displayed
private void manageLastNameSpinner() {
if (mNameAdapter == null) return;
mLastNameList = mDBHlpr.getRows(mNameSpinner.getSelectedItem().toString(),false);
if (mLastNameAdapter == null) {
mLastNameAdapter = new ArrayAdapter<>(this,android.R.layout.simple_dropdown_item_1line,mLastNameList);
mLastNameSpinner.setAdapter(mLastNameAdapter);
} else {
mLastNameAdapter.clear();
mLastNameAdapter.addAll(mLastNameList);
mLastNameAdapter.notifyDataSetChanged();
}
}
//Add some data to the database if none exists
private void addSomeTestingData() {
if (DatabaseUtils.queryNumEntries(mDBHlpr.getWritableDatabase(),DBHelper.TBL_MYTABLE) > 0) return;
mDBHlpr.addRow("Fred","Bloggs");
mDBHlpr.addRow("Joe","Smith");
mDBHlpr.addRow("Joe","Bloggs");
mDBHlpr.addRow("Fred","Smith");
mDBHlpr.addRow("Mary", "Jones");
mDBHlpr.addRow("Mary", "Taylor");
mDBHlpr.addRow("Mary", "QuiteContrary");
mDBHlpr.addRow("Anne","Boleyn");
mDBHlpr.addRow("Anne","Hathaway");
mDBHlpr.addRow("Annabel","Jones");
}
}
- Комментарии должны объяснить
Результат
При первом запуске и выборе имени Spinner: -
![enter image description here](https://i.stack.imgur.com/AEDDs.png)
Выбор Anne из имени Spinner, а затем выбор LastName Spinner: -
![enter image description here](https://i.stack.imgur.com/BsYvo.png)