首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我想查询特定的with Room,我应该如何编码?

如果我想查询特定的with Room,我应该如何编码?
EN

Stack Overflow用户
提问于 2021-04-25 09:13:04
回答 2查看 39关注 0票数 0

我现在正在学习如何使用Android中的Room在本地数据库中保存数据。我已经在这个链接中完成了Codelab。https://developer.android.com/codelabs/android-room-with-a-view#0我可以更新、插入、删除和查询表中的所有数据。现在,我希望使用特定的id查询数据。我应该如何在ViewModel和Repository类中编码?谢谢。我的桌子名叫“日记”,Diary.class

代码语言:javascript
复制
@Entity(tableName = "diary_table")
public class Diary {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "diary_title")
    private String diary_Title;
    @ColumnInfo(name = "diary_content")
    private String diary_Content;


    public Diary(@NonNull String diary_Title, String diary_Content) {
        this.diary_Title = diary_Title;
        this.diary_Content = diary_Content;
    }
    
    public void setDiary_Title(String diary_Title) {
        this.diary_Title = diary_Title;
    }

    public void setDiary_Content(String diary_Content) {
        this.diary_Content = diary_Content;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public String getStrId() {
        return String.valueOf(id);
    }

    public String getDiary_Title() {
        return diary_Title;
    }

    public String getDiary_Content() {
        return diary_Content;
    }
}

DiaryDao.class

代码语言:javascript
复制
@Dao
public interface DiaryDao {

    @Insert
    void insertDiaries(Diary... diaries);

    @Update
    void updateDiaries(Diary... diaries);

    @Delete
    void deleteDiaries(Diary... diaries);

    //删除到一无所有 慎用!
    @Query("DELETE FROM diary_table")
    void deleteAllDiaries();

    @Query("SELECT * FROM diary_table ORDER BY ID ASC")
    LiveData<List<Diary>>getAllDiariesLive();//get all diary

    @Query("SELECT * FROM diary_table WHERE ID=:id")
    LiveData<Diary> getSpecificDiariesLive(int id);//get specific diary

}

DiaryRepository

代码语言:javascript
复制
class DiaryRepository {
    private LiveData<Diary> specificDiary;
    private LiveData<List<Diary>> allDiariesLive;
    private DiaryDao diaryDao;

    DiaryRepository(Context context) {
        DiaryRoomDatabase diaryRoomDatabase = DiaryRoomDatabase.getDiaryDatabase(context.getApplicationContext());
        diaryDao = diaryRoomDatabase.getDiaryDao();
        allDiariesLive = diaryDao.getAllDiariesLive();
        specificDiary = diaryDao.getSpecificDiariesLive(/**how should i code here***/);
    }

    void insetDiaries(Diary... diaries) {
        new InsertAsyncTask(diaryDao).execute(diaries);
    }

    void updateDiaries(Diary... diaries) {
        new UpdateAsyncTask(diaryDao).execute(diaries);
    }

    void deleteDiaries(Diary... diaries) {
        new DeleteAsyncTask(diaryDao).execute(diaries);
    }

    void deleteAllDiaries(Diary... diaries) {
        new DeleteAllAsyncTask(diaryDao).execute();
    }

    LiveData<Diary> getSpecificDiary(int i) {return specificDiary; }

    LiveData<List<Diary>> getAllDiariesLive() {
        return allDiariesLive;
    }

    static class InsertAsyncTask extends AsyncTask<Diary, Void, Void> {
        private DiaryDao diaryDao;

        InsertAsyncTask(DiaryDao diaryDao) {
            this.diaryDao = diaryDao;
        }


        @Override
        protected Void doInBackground(Diary... diaries) {
            diaryDao.insertDiaries(diaries);
            return null;
        }
    }

    static class UpdateAsyncTask extends AsyncTask<Diary, Void, Void> {
        private DiaryDao diaryDao;

        UpdateAsyncTask(DiaryDao diaryDao) {
            this.diaryDao = diaryDao;
        }

        @Override
        protected Void doInBackground(Diary... diaries) {
            diaryDao.updateDiaries(diaries);
            return null;
        }
    }

    static class DeleteAsyncTask extends AsyncTask<Diary, Void, Void> {
        private DiaryDao diaryDao;

        DeleteAsyncTask(DiaryDao diaryDao) {
            this.diaryDao = diaryDao;
        }

        @Override
        protected Void doInBackground(Diary... diaries) {
            diaryDao.deleteDiaries(diaries);
            return null;
        }

    }

    static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {
        private DiaryDao diaryDao;

        DeleteAllAsyncTask(DiaryDao diaryDao) {
            this.diaryDao = diaryDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            diaryDao.deleteAllDiaries();
            return null;
        }

    }
}

DiaryViewModel.class

代码语言:javascript
复制
public class DiaryViewModel extends AndroidViewModel {
    private DiaryRepository diaryRepository;

    public DiaryViewModel(@NonNull Application application) {
        super(application);
        diaryRepository = new DiaryRepository(application);
    }

    public LiveData<Diary> getSpecificDiary(/**how should i code here?**/) {
        return diaryRepository.getSpecificDiary(i);
    }

    public LiveData<List<Diary>> getAllDiariesLive() {
        return diaryRepository.getAllDiariesLive();
    }

    public void insertDiaries(Diary... diaries) {
        diaryRepository.insetDiaries(diaries);
    }

    public void updateDiaries(Diary... diaries) { diaryRepository.updateDiaries(diaries); }

    public void deleteDiary(Diary... diaries) { diaryRepository.deleteDiaries(diaries);}

    public void deleteAllDiaries() {
        diaryRepository.deleteAllDiaries();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-25 09:57:29

我认为在DiaryRepository:

代码语言:javascript
复制
class DiaryRepository {
private LiveData<List<Diary>> allDiariesLive;
private DiaryDao diaryDao;

DiaryRepository(Context context) {
    DDiaryRoomDatabase diaryRoomDatabase = DiaryRoomDatabase.getDiaryDatabase(context.getApplicationContext());
    diaryDao = diaryRoomDatabase.getDiaryDao();
    allDiariesLive = diaryDao.getAllDiariesLive();
}


void insetDiaries(Diary... diaries) {
    new InsertAsyncTask(diaryDao).execute(diaries);
}

void updateDiaries(Diary... diaries) {
    new UpdateAsyncTask(diaryDao).execute(diaries);
}

void deleteDiaries(Diary... diaries) {
    new DeleteAsyncTask(diaryDao).execute(diaries);
}

void deleteAllDiaries(Diary... diaries) {
    new DeleteAllAsyncTask(diaryDao).execute();
}

LiveData<Diary> getSpecificDiary(int i) {
    return diaryDao.getSpecificDiariesLive(i); 
}

LiveData<List<Diary>> getAllDiariesLive() {
    return allDiariesLive;
}

...

因此,您的ViewModel将更改为:

代码语言:javascript
复制
public class DiaryViewModel extends AndroidViewModel {
private DiaryRepository diaryRepository;

public DiaryViewModel(@NonNull Application application) {
    super(application);
    diaryRepository = new DiaryRepository(application);
}

public LiveData<Diary> getSpecificDiary(int i) {
    return diaryRepository.getSpecificDiary(i);
}
...
票数 1
EN

Stack Overflow用户

发布于 2021-04-25 16:23:41

DiaryRepository.class和ViewModel.class喜欢hosseini sajad代码。我应该在livedata中使用它,如下所示:

代码语言:javascript
复制
mDiaryViewModel = new ViewModelProvider(activity).get(DiaryViewModel.class);
mDiaryViewModel.getSpecificDiary(pos+1).observe(activity, diary -> {
                    Log.d("test", "Here is the Title: " + diary.getDiary_Title() + "\n" + "Here is the Content: " +diary.getDiary_Content() );
                });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67251676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档