как загрузить элементы spinner из базы данных SQLite в режиме реального времени?

#android #sqlite #spinner

Вопрос:

У меня есть действие, в котором есть счетчик, и его адаптер заполняется элементами базы данных. существует каталог добавления предупреждений, который позволяет пользователю добавлять новые элементы в базу данных. проблема в том, что новые элементы не будут отображаться в spinner, если пользователь не вернется к родительскому действию и снова не откроет это действие. есть ли в любом случае возможность загружать элементы spinner в режиме реального времени?

Вот база данных. Я не вдавался в подробности о том, как создается база данных, потому что, очевидно, она в порядке и работает. проблема в другом

 public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final String GROUP_TABLE_NAME = "Groups";
    private static final String GROUP_ID = "_id";
    private static final String GROUP_TITLE = "group_title";

    void addGroup(String title) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(GROUP_TITLE, title);
        long result = db.insert(GROUP_TABLE_NAME, null, cv);
        if (result == -1) {
            Toast.makeText(context, "Failed", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Added successfully!", Toast.LENGTH_SHORT).show();
        }
    }

    Cursor readAllGroups() {
        String query = "SELECT * FROM "   GROUP_TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = null;
        if (db != null) {
            cursor = db.rawQuery(query, null);
        }
        return cursor;
    }
}

 

вот деятельность, в которой участвует спиннер. addGroup является методом onclick для кнопки, которая открывает каталог предупреждений и так далее…

 
public class GoodsAdd extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.goods_add);
        makeSpinner();
    }

    private void makeSpinner() {
        ArrayList<String> groups = new ArrayList<>();
        MyDatabaseHelper myDB = new MyDatabaseHelper(GoodsAdd.this);
        Cursor cursor = myDB.readAllGroups();
        if (cursor.getCount() != 0) {
            while (cursor.moveToNext()) {
                groups.add(cursor.getString(1));
            }
        }
        Spinner spinner = findViewById(R.id.group_spinner);
        spinner.setOnItemSelectedListener(this);
        ArrayAdapter ad = new ArrayAdapter(this, R.layout.spinner_item, groups);
        ad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(ad);
    }

    public void addGroup(View view) {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        final EditText edittext = new EditText(this);
        edittext.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
        alert.setMessage("new group name:");
        alert.setView(edittext);

        alert.setPositiveButton("submit", (dialog, whichButton) -> {
            MyDatabaseHelper myDB = new MyDatabaseHelper(GoodsAdd.this);
            String title = edittext.getText().toString().trim();
            myDB.addGroup(title);
            Toast.makeText(GoodsAdd.this, title   " !!!!!", Toast.LENGTH_SHORT).show();
        });
        alert.show();
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {}
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {}

}
 

Комментарии:

1. Это потребует значительных изменений в вашем проекте, но взгляните на комбинацию Room amp; LiveData medium.com/mindorks/…

2. Используйте комнату и данные о жизни. Это единственное решение для получения текущих обновлений из базы данных sqlite

3. @SimranSharma Это не единственное решение, но оно самое простое — наверное 🙂