首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android -如何从widget访问房间数据库

Android -如何从widget访问房间数据库
EN

Stack Overflow用户
提问于 2018-08-23 03:31:13
回答 8查看 4.9K关注 0票数 8

我想在我的小部件类中访问Room DB,以便根据存储的数据更新小部件。

这里问题是ViewModelProvider需要一个片段或活动才能使用。

ViewModelProviders.of(fragment).get(YourViewModel.class);

哪一个在app widget类中不可用,那么该怎么做呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-08-23 03:46:41

所以在这里回答我自己..

唯一有效的方法是使用上下文从抽象类中获取DB实例,并在后台线程中直接运行DAO查询,而不使用ViewModelProviders类

new AsyncTask<Context, Void, List<Data>>(){ @Override protected List<Quote> doInBackground(Context... context) { List<Data> List=null; AppDatabase db = AppDatabase.getDatabase(context[0]); List = db.DataModel().getData(); return List; } @Override protected void onPostExecute(List<Quote> List) { super.onPostExecute(List); if(List != null){ final Random random=new Random(); for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId, quoteList.get(random.nextInt(List.size()))); } } } }.execute(context); }

票数 4
EN

Stack Overflow用户

发布于 2018-10-13 19:54:49

如果使用RemoteViewsService填充小部件UI,则可以通过在其onDataSetChanged()方法中而不是AppWidgetProvider的onUpdate()方法中包含DAO查询来避免使用AsyncTask。正如onDataSetChanged() documentation中所述,

在此方法中,可以安全地同步执行

...expensive任务。在此期间,旧数据将显示在小部件中。

这里的另一个优点是,您可以在应用程序的ViewModel观察者的onChanged()方法中包含对AppWidgetManager.notifyAppWidgetViewDataChanged()的调用;这将触发onDataSetChanged(),并且小部件将在每次Room数据库更改时更新,而不仅仅是在onUpdate()的固定时间间隔更新。

票数 6
EN

Stack Overflow用户

发布于 2019-12-19 19:08:41

我知道这已经有一段时间了,但我只是偶然发现了这个问题,并想在同事Aaron-dunigan-atlee的启发下添加一些有用的东西。

基本上是显示数据库和Dao对象的位置...更重要的是,调用房间查询的onDataSetChanged()方法。这个例子是为了给应用程序做笔记来说明,正如上面所说的,不需要AsyncTasks anywhere。

代码语言:javascript
复制
public class MyWidgetRemoteViewsService extends RemoteViewsService
{
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent)
    {
        return new MyRemoteViewsFactory(this.getApplicationContext(), intent);
    }

    class MyRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
    {
        private NotesDao notesDao;
        private List<Note> allNotes;

        MyRemoteViewsFactory(Context context, Intent intent)
        {
            MyDb db;
            db = MyDatabase.getDatabase(context);
            notesDao = db.notesDao();
        }

        @Override
        public void onCreate() { }

        @Override
        public void onDataSetChanged()
        {
            allNotes = notesDao.getAllNotes();
        }

        @Override
            public int getCount()
            { ...

sasa

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51973927

复制
相关文章

相似问题

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