为什么我的地图活动在空对象引用`上返回''android.database.Cursor.getCount()'

时间:2015-08-13 16:56:01

标签: android

有一个奇怪的问题,无法找到解决方案。我已经从使用eclipse转移到Android工作室并且应用程序在eclipse中工作正常,但现在在android studio中没有。

基本上我的应用程序有一个带有数据库的地图,用于返回数据和保存数据。所以我在android studio中重新编写了应用程序,但现在得到了这个:

java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference
        at com.new.newapp.activity.FragmentGoogleMap.onLoadFinished(FragmentGoogleMap.java:436)
        at com.new.newapp.activity.FragmentGoogleMap.onLoadFinished(FragmentGoogleMap.java:67)

所以第67行是这样的:

67 --> public class FragmentGoogleMap extends Fragment implements
        OnMapLongClickListener,
        LoaderCallbacks<Cursor>,
        OnMarkerClickListener,
        OnInfoWindowClickListener {

然后在第436行:

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
        int locationCount;
        double lat= 0;
        double lng= 0;
        float zoom= 0;
        String title;
        String snippet;
        String id;
437 --> locationCount = arg1.getCount();
        arg1.moveToFirst();

值得一提的是:以前该类扩展了Activity,现在它正在扩展Fragment。

可以帮助一些人。

修改

光标:

 map.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
    getActivity().getSupportLoaderManager().initLoader(0, null, this);

 .....

  @Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    Uri uri = LocationsContentProvider.CONTENT_URI;
    return new CursorLoader(getActivity(), uri, null, null, null, null);
}

 .....

  @Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    getActivity();  //I added this but still doesn't work
    int locationCount;
    double lat= 0;
    double lng= 0;
    float zoom= 0;
    String title;
    String snippet;
    String id;
    locationCount = arg1.getCount();
    arg1.moveToFirst();

    for(int i=0;i<locationCount;i++){
        lat = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LAT));
        lng = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LNG));
        zoom = arg1.getFloat(arg1.getColumnIndex(LocationsDB.FIELD_ZOOM));
        title = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_MTITLE));
        snippet = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_MSNIPPET));
        id = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_PICTURE));
        filepoint = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_MFILEPATH));
        onPoint = new LatLng(lat, lng);
        createMarker(onPoint, title, snippet, id, filepoint);
        arg1.moveToNext();
    }
    if(locationCount>0){
        map.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat,lng)));
        map.animateCamera(CameraUpdateFactory.zoomTo(zoom));
    }
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
}
class LocationInsertTask extends AsyncTask<ContentValues, Void, Void>{
    @Override
    protected Void doInBackground(ContentValues... contentValues) {
        getActivity().getContentResolver().insert(LocationsContentProvider.CONTENT_URI, contentValues[0]);
        return null;
    }
}

private class LocationDeleteTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        getActivity().getContentResolver().delete(LocationsContentProvider.CONTENT_URI, null, null);
        return null;
    }

1 个答案:

答案 0 :(得分:0)

这只是因为您的内容提供商LocationsContentProvider在查询Uri null时会返回LocationsContentProvider.CONTENT_URI;
请重新检查您的内容提供商。

此外,我发现您的曝光代码与link中的内容非常相似 如果您的代码和该链接相同。
你应该检查所有这些:

  • PROVIDER_NAME与清单中的authorities匹配?
  • LocationsContentProvider.CONTENT_URI是否与UriMatcher规则匹配?
  • query方法中有任何错误可以返回null