Запрос в базе данных комнат в Android Studio

У меня есть список заметок в базе данных комнат. Я хочу выбрать список конкретных заметок в зависимости от какой-то характеристики. Для этого я добавляю второе поле 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();

только тогда я получаю список всех заметок, которые у меня есть. Но мне нужны только специально отмеченные заметки.

Что не так и что мне делать? Похоже, что с запросом что-то не так ... Может быть, кто-нибудь, кто имел опыт работы с данными комнат и запросами к ним, может дать совет ...

0
0
194
1

Ответы 1

Собственно, я решил проблему. Вот решение. Я использовал следующий запрос:

@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, дайте мне знать, написав здесь ваше решение.

Другие вопросы по теме