2014-03-25 33 views
1

我試圖連接我Widget到應用程序的數據庫,但我不明白的事情。
爲什麼這個工程:getApplicationContext()與的AppWidgetProvider

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()); 

如何將窗口小部件連接到數據庫?我的意思是我怎樣才能從一個小部件類做查詢?

謝謝。

+0

小部件不活動。小部件的主要目的是顯示用戶可以從主屏幕直接觸發的常用功能。 – Libin

+0

@Libin的問題是另一個問題:我怎樣才能做一個小部件類的查詢?我知道這是可以做到...謝謝:) – user3223863

+0

'getContentResolver()' – Blundell

回答

2

AppWidgetProvider延伸BroadcastReceiver,它不會繼續從Context繼承。 getApplicationContext()Context上的一種方法。正如你確定的,你爲什麼通過Context到的BroadcastReceiver(和onUpdate()和其他回調AppWidgetProvider),所以你可以做的事情需要Context

之所以這麼說,你這裏的代碼有問題:

  1. 不要使用從Context繼承的方法從一個初始值,因爲你有你的Activity片段。無法保證此類方法在該時間點可以使用。使用Context方法延遲,直到組件的初始入口點,例如ActivityonCreate()

  2. 從來不是主要的應用程序線程做數據庫I/O,因爲它會凍結你的應用程序的用戶界面,如果你的活動之一恰好是在當時的前景。在主應用程序線程上調用AppWidgetProvider的所有回調,如onUpdate()。請使用IntentService或其他可安全運行後臺線程的其他內容。請注意,IntentService完全可以通過AppWidgetManager更新應用小部件用戶界面。 onUpdate()觸發爲您做一些工作,但這項工作可以 - 而且往往時間應 - 在其他地方進行。

  3. 要非常小心地創建各種SQLiteOpenHelper實例,並且我假設SqlHelperSQLiteOpenHelper的子類。請您在SQLiteOpenHelper正好一個實例爲您的整個應用程序,讓您可以內置到SQLiteOpenHelper線程安全的優勢。這通常是一個單身人士SQLiteOpenHelper。擁有多個實例可能會導致您遇到線程相關的麻煩。