I am trying to save markers to my app when users tap on the map. Previously I uses a different method of doing this, (using eclipse) but have since moved on to android studio and for some weird reason that code doesn't work crashes when app launch. I have also asked a question on SO (thanks to all that helped) but wasn't successful. So I was advised to use a different method, so have decided to use SQLite database.
So this is what I am sitting with now:
24434-24434/com.new.newapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.new.newapp, PID: 24434
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at com.new.newapp.activity.FragmentGoogleMap.onViewCreated(FragmentGoogleMap.java:109)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
So here is my code:
FragmentGoogleMap class:
Context context = getActivity();
MarkerDataSource Mdata;
MyMarkerObj Mobj;
static final ContentValues contentValues = new ContentValues();
boolean dbCheckedOpen = false;
.....
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Mdata = new MarkerDataSource(context);
Mobj = new MyMarkerObj();
try {
Mdata.open();
dbCheckedOpen = true;
}
catch (Exception e) {
}
//LINE 109 -->// Cursor cursor = Mdata.db.query(LocationsDB.DATABASE_TABLE, Mdata.cols, null, null, null, null, null, null);
if (cursor != null) {
List<MyMarkerObj> mmo = Mdata.getMarkers();
for (int i = 0; i < mmo.size(); i++)
{
String latidutes = mmo.get(i).getLat().toString();
String langidutes = mmo.get(i).getLng().toString();
LatLng latlngs = new LatLng(Double.valueOf(latitudes), Double.valueOf(longitudes));
mMap.addMarker(new MarkerOptions()
.title(mmo.get(i).getTitle().toString())
.snippet(mmo.get(i).getSnippet().toString())
.position(latlngs));
}
}
}
.....
@Override
public void onMapLongClick(final LatLng point) {
if (dbCheckedOpen == false)
{
try {
Mdata.open();
}
catch (Exception e) {
}
}
LayoutInflater li = LayoutInflater.from(getActivity());
final View v = li.inflate(R.layout.alertlayout, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v);
builder.setIcon(R.drawable.ic_home);
builder.setCancelable(true);
builder.setPositiveButton("Take Photo", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
EditText title = (EditText) v.findViewById(R.id.ettitle);
EditText snippet = (EditText) v.findViewById(R.id.etsnippet);
Marker marker = mMap.addMarker(new MarkerOptions()
.title(title.getText().toString())
.snippet(snippet.getText().toString())
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
.position(point));
markerId = marker.getId();
Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
timeStamp = new SimpleDateFormat("ddMMMyyyy_HH:mm:ss").format(new Date());
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
imagesFolder.mkdirs();
image = new File(imagesFolder.getPath(), "MyMarkerImages_" + timeStamp + ".jpg");
fileUri = Uri.fromFile(image);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(imageIntent, TAKE_PICTURE);
Mobj.setLat(String.valueOf(point.latitude));
Mobj.setLng(String.valueOf(point.longitude));
Mobj.setZom(String.valueOf(mMap.getCameraPosition().zoom));
Mobj.setTitle(String.valueOf(title.getText()));
Mobj.setSnippet(String.valueOf(snippet.getText()));
Mobj.setImage(String.valueOf(markerId));
Mobj.setFilepath(String.valueOf(image.getAbsolutePath()));
contentValues.put(LocationsDB.FIELD_LAT, Mobj.getLat());
contentValues.put(LocationsDB.FIELD_LNG, Mobj.getLng());
contentValues.put(LocationsDB.FIELD_ZOM, Mobj.getZom());
contentValues.put(LocationsDB.FIELD_TITLE, Mobj.getTitle());
contentValues.put(LocationsDB.FIELD_SNIP, Mobj.getSnippet());
contentValues.put(LocationsDB.FIELD_IMAGE, Mobj.getImage());
contentValues.put(LocationsDB.FIELD_FILEPATH, Mobj.getFilepath ());
Locations DB Class:
public class LocationsDB extends SQLiteOpenHelper {
/** Database name */
private static final String DBNAME = "markerlocations.db";
/** Version number of the database */
private static final int VERSION = 1;
public static final String FIELD_ROW_ID = "_id";
public static final String FIELD_LAT = "lat";
public static final String FIELD_LNG = "lng";
public static final String FIELD_ZOM = "zom";
public static final String FIELD_TITLE = "title";
public static final String FIELD_SNIP = "snip";
public static final String FIELD_IMAGE = "img";
public static final String FIELD_FILEPATH = "filep";
/** A constant, stores the the table name */
public static final String DATABASE_TABLE = "locations";
public static final String DB_CREATE = "create table " + DATABASE_TABLE + " ( " +
FIELD_ROW_ID + " integer primary key autoincrement , " +
FIELD_LNG + " text , " +
FIELD_LAT + " text , " +
FIELD_ZOM + " text , " +
FIELD_TITLE + " text , " +
FIELD_SNIP + " text , " +
FIELD_IMAGE + " blob , " +
FIELD_FILEPATH + "text , " +
" ) ";
/** Constructor */
public LocationsDB(Context context) {
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DB_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (db == null) {
db.execSQL(DATABASE_TABLE);
onCreate(db);
}
}
}
MarkerDataSource Class
public class MarkerDataSource {
LocationsDB mDB;
SQLiteDatabase db;
final String[] cols = {
LocationsDB.FIELD_LAT,
LocationsDB.FIELD_LNG,
LocationsDB.FIELD_ZOM,
LocationsDB.FIELD_TITLE,
LocationsDB.FIELD_SNIP,
LocationsDB.FIELD_IMAGE,
LocationsDB.FIELD_FILEPATH };
FragmentGoogleMap main;
public MarkerDataSource(Context C) {
mDB = new LocationsDB(C);
}
public void open() throws SQLException
{
db = mDB.getWritableDatabase();
}
public void close()
{
db.close();
}
public void addMarker()
{
main = new FragmentGoogleMap();
db.insert(LocationsDB.DATABASE_TABLE, null, main.contentValues);
}
public List<MyMarkerObj> getMarkers() {
List<MyMarkerObj> markers = new ArrayList<MyMarkerObj>();
Cursor cursor = db.query(LocationsDB.DATABASE_TABLE, cols, null, null, null, null, null, null);
cursor.moveToFirst();
while ( !cursor.isAfterLast())
{
MyMarkerObj mmo = cursorToMarker(cursor);
markers.add(mmo);
cursor.moveToNext();
}
cursor.close();
return markers;
}
private MyMarkerObj cursorToMarker(Cursor cursor) {
MyMarkerObj mmo = new MyMarkerObj();
mmo.setLat(cursor.getString(0));
mmo.setLng(cursor.getString(1));
mmo.setZom(cursor.getString(2));
mmo.setTitle(cursor.getString(3));
mmo.setSnippet(cursor.getString(4));
mmo.setFilepath(cursor.getString(5));
mmo.setLng(cursor.getString(1));
return mmo;
}
MyMarkerObj Class
public class MyMarkerObj {
private Long id;
private String lat;
private String lng;
private String zom;
private String title;
private String snip;
private String image;
private String filep;
public MyMarkerObj() {
// TODO Auto-generated constructor stub
}
public MyMarkerObj(Long id, String lat, String lng, String zom, String title, String snip, String img, String filep)
{
this.setId(id);
this.setLat(lat);
this.setLng(lng);
this.setZom(zom);
this.setTitle(title);
this.setSnippet(snip);
this.setImage(img);
this.setFilepath(filep);
}
public MyMarkerObj(String lat, String lng, String zom, String title, String snip, String img, String filep)
{
this.setLat(lat);
this.setLng(lng);
this.setZom(zom);
this.setTitle(title);
this.setSnippet(snip);
this.setImage(img);
this.setFilepath(filep);
}
//ID
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
//Latitude
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
//Longitude
public String getLng() {
return lng;
}
public void setLng(String lng) {
this.lng = lng;
}
//Zoom
public String getZom() {
return zom;
}
public void setZom(String zom) {
this.zom = zom;
}
//Title
public String getTitle() {
return zom;
}
public void setTitle(String title) {
this.title = title;
}
//Snippet
public String getSnippet() {
return zom;
}
public void setSnippet(String snip) {
this.snip = snip;
}
//File Path
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
//File Path
public String getFilepath() {
return filep;
}
public void setFilepath(String filep) {
this.filep = filep;
}
I am really sorry for all the code, but am not sure what I am doing wrong?