使用绿色DAO与内容提供程序获取错误

时间:2015-11-30 13:28:51

标签: greendao

我使用GreenDao生成ContentProvider,当我尝试使用它时出错了。告诉我“在内容提供程序处于活动状态时必须设置DaoSession”。我不知道在哪里设置DaoSession。

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

}

2 个答案:

答案 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;

在您的申请代码中

@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;
    /***********************************************/

}

答案 1 :(得分:0)

因为ContentProvider是在Application之前创建的。 因此,daoSession在创建ContentProvider时将为空。