使用SQLiteOpenHelper的问题,在create上返回null,可能是Thread问题

时间:2011-02-22 14:55:19

标签: java android

我有一个名为 GeneralDataProvider 的ContentProvider。哪个电话

@Override
public boolean onCreate() {
    mDatabaseOpenHelper = new DatabaseOpenHelper(getContext());
    return true;
}

看起来像:

private static class DatabaseOpenHelper extends SQLiteOpenHelper {
    DatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.e("DataBaseOpenHelper", "onCreate()");
        //The columns we'll include in the dictionary table
        //db.execSQL("CREATE TABLE general " + 
        // .. and more
    }
}

问题

只要我在Activity中运行managedQuery(...)就可以正常工作,但是当我尝试在线程中执行以下代码时,我会得到一个NullPointerException。

 public class SyncManager extends Thread {

         @Override
         public void run() {
            mIntent = new Intent();
            mIntent.setData(GeneralDataColumns.CONTENT_URI);
            GeneralDataProvider generalProvider = new GeneralDataProvider();
            mCursor = generalProvider.query(mIntent.getData(), GENERAL_PROJECTION, selection, null,
            GeneralDataColumns.DEFAULT_SORT_ORDER);
     }
 }

这是从我的主要活动中执行的

    mSyncManager = new SyncManager();
    mSyncManager.start();

在深入挖掘之后,事实证明导致NullPointerException的原因是GeneralDataProvider.query()中的以下行。

       SQLiteDatabase db = mDatabaseOpenHelper.getReadableDatabase();

由于mDatabaseOpenHelper为null。

我是否以错误的方式使用我的ContentProvider?

我尝试过: 添加了'synchronized'到我的GeneralDataProvider

中的query()方法

1 个答案:

答案 0 :(得分:0)

原来我错了。

问题是query()没有像我预期的那样工作。我必须将ContentResolver发送到我的SyncManager类

    mSyncManager = new SyncManager(getContentResolver());
    mSyncManager.start();

然后在执行实际查询时使用该ContentResolver。

    public SyncManager(ContentResolver context) {
        mContentResolver = context;
    }

    @Override
    public void run() {

       // General data
       mIntent = new Intent();
       mIntent.setData(GeneralDataColumns.CONTENT_URI);
       mCursor = mContentResolver.query(mIntent.getData(), GENERAL_PROJECTION, selection, null, GeneralDataColumns.DEFAULT_SORT_ORDER);
   }

这解决了我所有的问题!