【问题标题】:Android - Room Repository and AsyncTask, how to use query to get back data from tableAndroid - Room Repository 和 AsyncTask,如何使用查询从表中取回数据
【发布时间】:2018-11-28 08:15:40
【问题描述】:

如何使用 AsyncTask 从 Room 实体获取数据?我一直在查看有关 AsyncTask 的答案,但我不明白。

这是我的道:

@Dao
public interface BudgetDao {

    @Insert
    public void insert (Budget budget);

    @Update
    public void update (Budget budget);

    @Query("SELECT id FROM budget_table WHERE category = :category AND date = :date")
    int getId(String category, String date);

    @Query("SELECT * FROM budget_table")
    LiveData<List<Budget>> getAllBudgets();

    @Query("SELECT category FROM budget_table")
    List<String> getAllCategories();

}

如何让存储库中的 AsyncTask 返回字符串列表?现在代码是public void getAllCategories() {new getAllCatsAsyncTask(mBudgetDao).execute();当我把void改成List时,报错提示我不能返回字符串列表

我的仓库:

public class BudgetRepository {

    private BudgetDao mBudgetDao;
    private LiveData<List<Budget>> mAllBudgets;

    BudgetRepository(Application application) {
        BudgetRoomDatabase db = BudgetRoomDatabase.getDatabase(application);
        mBudgetDao = db.budgetDao();
        mAllBudgets = mBudgetDao.getAllBudgets();
    }

    LiveData<List<Budget>> getAllBudgets() {return mAllBudgets;}
    public void insert (Budget budget) {new insertAsyncTask(mBudgetDao).execute(budget);}
    public void getAllCategories() {new getAllCatsAsyncTask(mBudgetDao).execute();}
    //How do I return a list of strings?


    private static class insertAsyncTask extends AsyncTask<Budget, Void, Void> {
        //code
    }

    private class getAllCatsAsyncTask extends AsyncTask<Void, Void, List<String>> {
        private BudgetDao mAsyncTaskDao;

        getAllCatsAsyncTask(BudgetDao dao) {mAsyncTaskDao = dao;}

        @Override
        protected List<String> doInBackground(Void... voids) {
            return mAsyncTaskDao.getAllCategories();
        }

    }

} 

在我的 ViewModel 中:

public class BudgetViewModel extends AndroidViewModel {

    private BudgetRepository mRepository;
    private LiveData<List<Budget>> mAllBudgets;

    public BudgetViewModel(@NonNull Application application) {
        super(application);
        mRepository = new BudgetRepository(application);
        mAllBudgets = mRepository.getAllBudgets();
    }

    LiveData<List<Budget>> getAllBudgets() {return mAllBudgets;}

    public void insert(Budget budget) {mRepository.insert(budget);}

    public List<String> getAllCats() { return mRepository.getAllCategories();} 
    //Android Studios show incompatible types (Void vs List<String>)

现在,在我的 ViewModel 中,mRepository.getAllCategories 不返回字符串列表。

我必须在我的 AsyncTask 中调用 onPostExecute 吗?如何链接来自onPostExecute 的结果,以便getAllCategories 可以在我的AsyncTask 中返回字符串列表?或者有没有更好的方法从我的 Dao 中调用查询?

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个代码..

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayData displayData=new DisplayData(studentDatabase);
        displayData.execute();
     }
    /**
     * this method display student.
     */
    private void DisplayStudent() {
        mStudentList.addAll(studentDatabase.studentDao().getStudent());
    }
    
    
      private class DisplayData extends AsyncTask<Void,Void,Void>
    {
        private StudentDatabase studentDatabase;
    
        public DisplayData(StudentDatabase studentDatabase) {
            this.studentDatabase = studentDatabase;
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            DisplayStudent();
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            mDialog.dismiss();
            mStu_adapter=new StudentAdapter(mStudentList,getApplicationContext());
            mStu_adapter.notifyDataSetChanged();
            mRvStudent.setAdapter(mStu_adapter);
            DividerItemDecoration divider=new DividerItemDecoration(getApplicationContext(),LinearLayout.VERTICAL);
            divider.setDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.divider));
            mRvStudent.addItemDecoration(divider);
       }
    }
    

    如果您想在 ma​​inThread 上允许,请设置此行。

          db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").allowMainThreadQueries().build();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多