Android服务无法打开数据库,因为(activity / context / this)为空

时间:2015-12-29 13:07:45

标签: android sqlite service android-asynctask nullpointerexception

我需要从MyService(extends Service)启动新的AsyncLoadJSONDoc(this).execute(),但问题是"这个"不能在那里。 如果我在Activity工作没有问题,我只需要创建构造函数来获取asynctask中的活动。 主要问题是我需要在服务的asynctask中打开我的数据库(空指针异常) 服务正在检查云以获取新信息并保存在android数据库中。 (每分钟)

public class AsyncLoadJSONDoc extends AsyncTask<URL, Integer, ArrayList<Storage.JSONDocument>> {
private static final String TAG = "AsyncLoadJSONDoc";
Activity mActivity;`
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSS'Z'");
Date date = new Date();

private static final String TAG = "AsyncLoadJSONDoc";
Activity mActivity;    

public AsyncLoadJSONDoc(Activity activity){
    mActivity = activity;
}

@Override
protected ArrayList<Storage.JSONDocument> doInBackground(URL... params) {
    StorageService storageService = App42API.buildStorageService();
    Storage storage = storageService.findAllDocuments(
            Constants.CLOUD_DB_NAME, Constants.COLLECTION_NAME);
    ArrayList<Storage.JSONDocument> jsonDocList = storage.getJsonDocList();
    Log.i(TAG, "Velikost databaze> " + jsonDocList.size());
    return jsonDocList;
}


protected void onPostExecute(ArrayList<Storage.JSONDocument> jsonDocList) {
    saveToDatabase(jsonDocList);
}

private void saveToDatabase(ArrayList<Storage.JSONDocument> jsonDocs) {
    Log.i(TAG, "saveToDatabase");
    Log.i(TAG + " Start>", df.format(date));

    SQLiteDatabase db = (new DatabaseHelper(mActivity)).getWritableDatabase(); // <---There is null exception
    ContentValues cv=new ContentValues();

    DatabaseHelper dq = new DatabaseHelper(mActivity);
    dq.onUpgrade(db, 1, 2);

    for(Storage.JSONDocument oneJsonDoc : jsonDocs) {
        cv.put(Constants.UPDATED_AT, oneJsonDoc.getUpdatedAt());
        cv.put(Constants.CREATED_AT, oneJsonDoc.getCreatedAt());
        cv.put(Constants.DOC_ID, oneJsonDoc.getDocId());
        cv.put(Constants.JSON, oneJsonDoc.getJsonDoc());
        if (oneJsonDoc.getLocation() == null) {
            Log.i(TAG, "Location NULL");
            cv.put(Constants.LATITUDE, (byte[]) null);
            cv.put(Constants.LONGITUDE, (byte[]) null);
        } else {
            cv.put(Constants.LATITUDE, oneJsonDoc.getLocation().getLat().floatValue());
            cv.put(Constants.LONGITUDE, oneJsonDoc.getLocation().getLng().floatValue());
        }
        db.insert(Constants.TABLE_NAME, Constants.JSON, cv);
        Log.i(TAG, "insert");
    }
    db.close();
    Log.i(TAG + " End>", df.format(date));
}

}

1 个答案:

答案 0 :(得分:0)

这是一个非常简单的修复,DatabaseOpenHelper只需要一个上下文,而不是实际的活动,所以你可以只改变构造函数:

public class AsyncLoadJSONDoc extends AsyncTask<URL, Integer, ArrayList<Storage.JSONDocument>> {

private Context mContext;

   public AsyncLoadJSONDoc(Context context){
       mContext = context.getApplicationContext();
   }

并替换为mContext

中的new DatabaseHelper(mContext)

你也应该删除这些行:

DatabaseHelper dq = new DatabaseHelper(mActivity);
dq.onUpgrade(db, 1, 2);

他们完全错了。您永远不应该致电onUpgrade,系统会在必要时自动为您拨打电话。