我有一个名为 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()方法答案 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);
}
这解决了我所有的问题!