将Green DAO与内容提供商一起使用会出错



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

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

遵循框架的建议

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

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

相关内容

  • 没有找到相关文章

最新更新