2013-01-20 25 views
2

如果我理解正確的話,用DB工作時,我必須做如下傳遞正確的上下文greendao的OpenHelper構造

DaoMaster.OpenHelper helper = new DaoMaster.OpenHelper(this, "test-db", null) { 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     } 
    }; 
    SQLiteDatabase db = helper.getWritableDatabase(); 
    DaoMaster daoMaster = new DaoMaster(db); 
    daoSession = daoMaster.newSession(); 

但是,如果我嘗試做這個類中沒有被延長的活動或服務,我只是沒有通過他們的背景。

什麼是正確的方法來打開我的數據庫?它應該在哪裏完成?

如果你可以提供除官方greendao(我找不到答案)以外的一些教程鏈接,它會很棒。

+0

你應該使用應用上下文。請參閱此討論以獲得很好的理解。 http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext – Simon

回答

7

提供自定義應用程序對象並使用其上下文(因此應用程序上下文)。

在您的AndroidManifest文件中提供了一個擴展Application的類。

<application android:label="@string/app_name" 
      android:name=".MyApp" 
      > 

MyApp的類看起來是這樣的:

public class MyApp extends Application { 

    private static MyApp instance; 
    public MyApp() { 
     instance = this; 
    } 

    public static MyApp getInstance() { 
     return instance; 
    } 
.... 

所以現在當你需要在你的應用程序上下文,您可以撥打MyApp.getInstance。只要您在調用MyApp的onCreate之後調用它,您就會安全無虞。請記住,instance是您的應用程序上下文,因此只要您的應用程序處於活動狀態,它就會一直存在。 (例如沒有泄漏的危險)

new DaoMaster.OpenHelper(MyApp.getInstance(), "test-db", null) 
-1

您可以從具有它的類(活動或服務)的上下文傳遞到從中你要調用OpenHelper類:

Public class NonActivity { 
private Context context; 

    public NonActivity(Context context) { 
     this.context = context; 
    } 
} 

,並使用它:

new OpenHelper(context, "test-db", null)

+1

您應該(幾乎)不會在Activity外部傳遞Activity上下文,並僅在需要使用Activity上下文來處理該Activity所擁有的資源和UI元素。 OP應該使用應用程序上下文。 http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html – Simon

+0

@soulreaver像這樣傳遞活動上下文可能會導致內存泄漏...... –