У меня есть список заметок в базе данных комнат. Я хочу выбрать список конкретных заметок в зависимости от какой-то характеристики. Для этого я добавляю второе поле note_second_id в PrimaryKey:
@PrimaryKey(autoGenerate = true)
private long note_id;
private long note_second_id;
Затем я создаю следующий запрос:
@Query("SELECT * FROM " + Constants.TABLE_NAME_NOTE + " WHERE note_second_id = :second_id ")
List<Note> getNotes(long second_id);
Когда я хочу добавить новую заметку, я использую:
long j = activityReference.get().dataBase.getNoteDao().insertNote(note);
deck.setNote_id(j);
deck.setNote_second_id(note000);
где методы .setNote_id () и setNote_second_id () выглядят так:
public void setNote_id(long deck_id) {this.note_id = note_id; }
public void setNote_second_id(long notesecondid) {
this.note_second_id = notesecondid; }
а note000 - константа:
Long note000 = 11111L;
И в упражнении, где я хочу, чтобы этот список был показан, я пишу:
private class RetrieveTaskDeck extends AsyncTask<Void,Void,List<Deck>> {
private WeakReference<MainActivity> activityReference;
// only retain a weak reference to the activity
RetrieveTaskDeck(MainActivity context) {
activityReference = new WeakReference<>(context); }
@Override
protected List<Note> doInBackground(Void... voids) {
if (activityReference.get()!=null)
return activityReference.get().dataBase.getNotesDao().getNotes(note000);
else
return null; }
@Override
protected void onPostExecute(List<Note> notes) {
if (notes !=null && notes.size()>0 ){
activityReference.get().notes.clear();
activityReference.get().notes.addAll(notes);
// hides empty text view
activityReference.get().textViewMsgDeck.setVisibility(View.GONE);
activityReference.get().decksAdapter.notifyDataSetChanged(); } } }
Проблема в том, что этот способ не работает. Он не показывает никаких заметок. Только когда я использую запрос:
@Query("SELECT * FROM " + Constants.TABLE_NAME_NOTE)
List<Note> getAllNotes();
а также
activityReference.get().dataBase.getNotesDao().getAllNotes();
только тогда я получаю список всех заметок, которые у меня есть. Но мне нужны только специально отмеченные заметки.
Что не так и что мне делать? Похоже, что с запросом что-то не так ... Может быть, кто-нибудь, кто имел опыт работы с данными комнат и запросами к ним, может дать совет ...
Собственно, я решил проблему. Вот решение. Я использовал следующий запрос:
@Query("SELECT * FROM " + Constants.TABLE_NAME_NOTE + " where note_content LIKE :second_id ")
List<Note> getNotes(String second_id);
Где note_content - это имя столбца, а second_id - первая строка, записанная после имени столбца:
@ColumnInfo(name = "note_content")
private String second_id;
Обратите внимание, если я напишу String second_id где-то после первого значения String (второго или третьего) после объявления столбца, поиск по этому слову не производится. Но так, как написано выше, работает.
Итак, я могу установить это строковое значение "second_id" столбца динамически, в зависимости от задачи, и пользователю не нужно знать, что оно вообще существует. Я попытался поиграть с ID в PrimaryKey, чтобы решить ту же задачу, но это не сработало. Собственно, использование значения String в Column работает. Надеюсь, это кому-то поможет. Кроме того, если кто-нибудь знает, как решить ту же задачу с использованием идентификаторов в PrimaryKey, дайте мне знать, написав здесь ваше решение.