【问题标题】:Android Service can't open database, because (activity / context /this) is nullAndroid Service 无法打开数据库,因为 (activity/context/this) 为空
【发布时间】:2015-12-29 13:07:44
【问题描述】:

我需要从 MyService(扩展服务)启动新的 AsyncLoadJSONDoc(this).execute(),但问题是“this”不存在。 如果我从 Activity 工作没有问题,我只需要创建构造函数以在 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));
}

}

【问题讨论】:

    标签: android sqlite service android-asynctask nullpointerexception


    【解决方案1】:

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

    public class AsyncLoadJSONDoc extends AsyncTask<URL, Integer, ArrayList<Storage.JSONDocument>> {
    
    private Context mContext;
    
       public AsyncLoadJSONDoc(Context context){
           mContext = context.getApplicationContext();
       }
    

    并在new DatabaseHelper(mContext) 中替换为mContext

    你也应该删除这些行:

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

    他们完全错了。千万不要拨打onUpgrade,必要时系统会自动为您拨打。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多