2015-11-30 34 views
2

我使用GreenDao生成ContentProvider,當我嘗試使用它出錯了,告訴我「DaoSession必須在內容提供商處於活動狀態時設置」。我不知道在哪裏設置DaoSession 。使用綠色DAO與內容提供商獲取錯誤

ContentProvider類如下

public class ContactContentProvider extends ContentProvider { 

public static final String AUTHORITY   = "com.junsucc.www.provider"; 
public static final String BASE_PATH   = "contact"; 
public static final Uri CONTENT_URI  = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); 
public static final String CONTENT_TYPE  = ContentResolver.CURSOR_DIR_BASE_TYPE 
     + "/" + BASE_PATH; 
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE 
     + "/" + BASE_PATH; 

private static final String TABLENAME = ContactDao.TABLENAME; 
private static final String PK  = ContactDao.Properties.Id 
     .columnName; 

private static final int CONTACT_DIR = 0; 
private static final int CONTACT_ID = 1; 

private static final UriMatcher sURIMatcher; 
static { 
    sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
    sURIMatcher.addURI(AUTHORITY, BASE_PATH, CONTACT_DIR); 
    sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", CONTACT_ID); 
} 

public DaoSession daoSession=BaseApplication.getDaoSession(); 


@Override 
public boolean onCreate() { 
    // if(daoSession == null) { 
    // throw new IllegalStateException("DaoSession must be set before content provider is created"); 
    // } 
    DaoLog.d("Content Provider started: " + CONTENT_URI); 
    return true; 
} 

protected SQLiteDatabase getDatabase() { 

    if (daoSession == null) { 
     throw new IllegalStateException("DaoSession must be set during content provider is active"); 
    } 
    return daoSession.getDatabase(); 
} 

    ...... 

如下

java.lang.IllegalStateException: DaoSession must be set during content provider is active 
 
at com.junsucc.www.ContactContentProvider.getDatabase(ContactContentProvider.java:71) 
 
at com.junsucc.www.ContactContentProvider.insert(ContactContentProvider.java:83) 
 
at android.content.ContentProvider$Transport.insert(ContentProvider.java:220) 
 
at android.content.ContentResolver.insert(ContentResolver.java:1190) 
 
at com.junsucc.junsucc.MD5UtilsTest.testProvider(MD5UtilsTest.java:58) 
 
at java.lang.reflect.Method.invokeNative(Native Method) 
 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) 
 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

,但我已經設置好的日DaoSession我的應用程序中的錯誤

public class BaseApplication extends Application { 
 

 
    private static Context mContext; 
 

 
    private static DaoMaster mDaoMaster; 
 
    private static DaoSession mDaoSession; 
 

 
    public static DaoMaster getDaoMaster() { 
 
     return mDaoMaster; 
 
    } 
 

 
    public static Context getContext() { 
 
     return mContext; 
 
    } 
 

 
    @Override 
 
    public void onCreate() { 
 

 
     mContext = getApplicationContext(); 
 
     DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(mContext, Constants.DB_NAME, null); 
 
     mDaoMaster = new DaoMaster(helper.getWritableDatabase()); 
 
     mDaoSession = mDaoMaster.newSession(); 
 
     super.onCreate(); 
 
    } 
 

 
}

+0

你有固定的這個問題? –

回答

0

按照框架

/** 
* This must be set from outside, it's recommended to do this inside your Application object. 
* Subject to change (static isn't nice). 
*/ 
public static DaoSession daoSession; 

的建議在你applicaction代碼

@Override 
public void onCreate() { 

    super.onCreate(); 
    DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(this, Constants.DB_NAME, null); 
    mDaoMaster = new DaoMaster(helper.getWritableDatabase()); 
    mDaoSession = mDaoMaster.newSession(); 

    /***********************************************/ 
    ContactContentProvider.daoSession = mDaoSession; 
    /***********************************************/ 

}