我正在尝试将我的Widget
连接到应用的数据库,但我不明白。
为什么会这样:
import android.app.Activity;
public class Widgets1 extends Activity{
mMioDbHelper = new SqlHelper(getApplicationContext());
这不是吗?
import android.appwidget.AppWidgetProvider;
public class Widgets1 extends AppWidgetProvider{
mMioDbHelper = new SqlHelper(getApplicationContext());
如何将小部件连接到数据库?我的意思是如何从widget类中进行查询?
感谢。
答案 0 :(得分:5)
AppWidgetProvider
扩展BroadcastReceiver
,而Context
则不会继承getApplicationContext()
。 Context
是Context
上的一种方法。正如您所确定的那样,您onReceive()
BroadcastReceiver
onUpdate()
AppWidgetProvider
以及Context
上的Context
和其他回调的原因是{...}}做需要Activity
的事情。
所有这些,你在这里的代码有问题:
请勿使用初始化程序中从Context
继承的方法,就像使用onCreate()
代码段一样。无法保证此类方法随时可用。延迟使用Activity
方法直到组件的初始入口点,例如AppWidgetProvider
的{{1}}。
永远不要在主应用程序线程上执行数据库I / O,因为如果您的某个活动恰好位于前台,它将冻结您的应用程序的UI。所有对onUpdate()
的回调,如IntentService
,都会在主应用程序线程上调用。请使用IntentService
或其他可安全运行后台线程的内容。请注意,AppWidgetManager
完全有能力通过onUpdate()
更新应用小部件用户界面。 SQLiteOpenHelper
是一个触发器,供您进行某些工作,但该工作可以 - 而且通常应该 - 在其他地方完成。
在创建各种SqlHelper
实例时要非常小心,我假设SQLiteOpenHelper
是SQLiteOpenHelper
的子类。请为您的整个应用程序提供SQLiteOpenHelper
的一个实例,以便您可以利用SQLiteOpenHelper
中内置的线程安全性。这通常会成为一个单身{{1}}。拥有多个实例可能会让您遇到与线程相关的问题。