从LiveData填充微调器(房间数据库)

马克·舍尔

我在哪里

我正在尝试使用Room将来自数据库的数据填充到微调器中。数据是术语列表,其中包含与之相关的课程。

我想在创建新课程时使用微调框,以选择与之关联的术语。

当前,微调器不显示默认选项,但是如果单击微调器,它将显示要选择的数据列表。从微调器中选择某项后,它不会显示您选择的内容。

选择之前/之后的微调器

微调器显示可用选项

这是我的代码,用于将数据加载到微调器的适配器中:

        termsList = new ArrayList<>();
        termIdList = new ArrayList<>();
        mTermViewModel = new ViewModelProvider(this).get(TermViewModel.class);
        mTermViewModel.getAllTerms().observe(this, new Observer<List<TermEntity>>() {
            @Override
            public void onChanged(@Nullable final List<TermEntity> terms) {
                for (TermEntity term : terms) {
                    termsList.add(term.getTermName());
                    termIdList.add(term.getTermId());
                }
            }
        });

        ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, termsList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mTermSpinner.setAdapter(adapter);
    }

这是TermDAO

@Dao
public interface TermDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(TermEntity term);

    @Query("DELETE FROM terms")
    void deleteAllTerms();

    @Query("SELECT * FROM terms ORDER BY termId ASC")
    LiveData<List<TermEntity>> getAllTerms();

    @Query("SELECT * FROM terms WHERE termId = :termId")
    LiveData<List<TermEntity>> getTerm(int termId);

    @Query("SELECT termId FROM terms WHERE termName = :termName")
    LiveData<List<TermEntity>> getTermIdByTermName(String termName);
}

这是TermViewModel

public class TermViewModel extends AndroidViewModel {
    private SchoolTrackerRepository mRepository;
    private LiveData<List<TermEntity>> mAllTerms;

    public TermViewModel(@NonNull Application application) {
        super(application);
        mRepository = new SchoolTrackerRepository(application);
        mAllTerms = mRepository.getAllTerms();
    }

    public LiveData<List<TermEntity>> getAllTerms() {
        return mAllTerms;
    }

    public void insert(TermEntity termEntity) {
        mRepository.insert(termEntity);
    }
}

我想在微调器中显示术语名称,并使用相应的termId来执行查询。

我尝试过的

我曾尝试使用Mutable LiveData而不是LiveData,但是当我尝试运行它时,出现一个错误消息:

错误:不确定如何将游标转换为此方法的返回类型

我真的很茫然。谢谢你的帮助。

添加存储库

public class SchoolTrackerRepository {
    private TermDAO mTermDAO;
    private CourseDAO mCourseDAO;
    int termId;
    private LiveData<List<TermEntity>> mAllTerms;
    private LiveData<List<CourseEntity>> mAllCourses;
    private LiveData<List<CourseEntity>> mAssociatedCourses;

    public SchoolTrackerRepository(Application application) {
        SchoolTrackerDatabase db = SchoolTrackerDatabase.getDatabase(application);
        mTermDAO = db.termDAO();
        mCourseDAO = db.courseDAO();

        mAllTerms = mTermDAO.getAllTerms();
        mAllCourses = mCourseDAO.getAllCourses();
    }

    public LiveData<List<TermEntity>> getAllTerms() {
        return mAllTerms;
    }

    public LiveData<List<CourseEntity>> getAllCourses() {
        return mAllCourses;
    }

    public LiveData<List<CourseEntity>> getmAssociatedCourses(int termId) {
        return mAssociatedCourses;
    }

    public void insert(TermEntity termEntity) {
        new insertAsyncTask1(mTermDAO).execute(termEntity);
    }

    private static class insertAsyncTask1 extends AsyncTask<TermEntity, Void, Void> {
        private TermDAO mAsyncTaskDAO;

        insertAsyncTask1(TermDAO dao) {
            mAsyncTaskDAO = dao;
        }

        @Override
        protected Void doInBackground(final TermEntity... params) {
            mAsyncTaskDAO.insert(params[0]);
            return null;
        }
    }

    public void insert(CourseEntity courseEntity) {
        new insertAsyncTask2(mCourseDAO).execute(courseEntity);
    }

    private static class insertAsyncTask2 extends AsyncTask<CourseEntity, Void, Void> {
        private CourseDAO mAsyncCourseDAO;

        insertAsyncTask2(CourseDAO dao) {
            mAsyncCourseDAO = dao;
        }

        @Override
        protected Void doInBackground(final CourseEntity... params) {
            mAsyncCourseDAO.insert(params[0]);
            return null;
        }
    }
}
duongdt3

我猜您在更新termsList变量后缺少了notifyDataSetChanged

试试看:

ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, termsList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mTermSpinner.setAdapter(adapter);

mTermViewModel = new ViewModelProvider(this).get(TermViewModel.class);
mTermViewModel.getAllTerms().observe(this, new Observer<List<TermEntity>>() {
    @Override
    public void onChanged(@Nullable final List<TermEntity> terms) {
        for (TermEntity term : terms) {
            termsList.add(term.getTermName());
            termIdList.add(term.getTermId());
        }

        //notifyDataSetChanged after update termsList variable here
        adapter.notifyDataSetChanged();
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

数据在房间数据库显示,从服务器中删除后,即使

来自分类常见问题

加入房间数据库收藏夹

来自分类Dev

使用 kotlin 的房间数据库

来自分类Dev

实现房间数据库 (Android)

来自分类Dev

房间数据库多列子查询

来自分类Dev

添加到房间数据库

来自分类Dev

从房间数据库中删除实体

来自分类Dev

多模块项目中的房间数据库

来自分类Dev

房间数据库不考虑类型转换器

来自分类Dev

如何在房间数据库中将LiveData分配给变量之前对其进行调整

来自分类Dev

改造成功后,协程问题将数据插入房间数据库

来自分类Dev

房间数据库。插入成功,但未找到数据

来自分类Dev

插入数据后房间数据库表还是空的

来自分类Dev

从房间数据库中获取当前周和月的数据

来自分类Dev

显示错误,而在房间数据库中插入用户

来自分类Dev

如何从房间数据库中获取多个计数?

来自分类Dev

房间数据库中GROUP BY语句的返回类型

来自分类Dev

如何在房间数据库中触发两个查询

来自分类Dev

如何在房间数据库中将列名作为参数传递?

来自分类Dev

即使房间数是最大数,该值仍存储在数据库中

来自分类Dev

在房间数据库中使用列表存储模型对象

来自分类Dev

房间数据库,用列表构建和查询实体

来自分类Dev

房间数据库中的自定义对象数组

来自分类Dev

Android Studio:如何让房间数据库自动生成记录 ID?

来自分类Dev

RxJava toMultiMap 不适用于房间数据库查询

来自分类Dev

如何在房间数据库中加入多个表

来自分类Dev

android - 房间数据库未创建架构组件

来自分类Dev

将最喜欢的图标添加到房间数据库

来自分类Dev

如何使用存储库和视图模型更新房间数据库中的字段

Related 相关文章

热门标签

归档