有一个奇怪的问题,无法找到解决方案。我已经从使用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;
}
答案 0 :(得分:0)
这只是因为您的内容提供商LocationsContentProvider
在查询Uri null
时会返回LocationsContentProvider.CONTENT_URI
;
请重新检查您的内容提供商。
此外,我发现您的曝光代码与link中的内容非常相似
如果您的代码和该链接相同。
你应该检查所有这些:
PROVIDER_NAME
与清单中的authorities
匹配?LocationsContentProvider.CONTENT_URI
是否与UriMatcher
规则匹配?query
方法中有任何错误可以返回null
?