0

I'm developing a mortgage calculator app. It works as follows -

1] You can make new calculations in CalculationFragment. You can save calculations for future.

2] Saved calculations are shown of Google Map in MapFragment.

I'm using SQLite to store all the saved data whenever user clicks save calculation in CalculationFragment. SQlite is created and read whenever the application is launched. I want to update the map everytime a user clicks save calculation. Whenever I try to access SQLite for the second time for updating the map, it throws object referencing error. I'm not able to figure out why it's throwing object referencing error. Please provide your inputs.

Below lines are throwing error in DatabaseHelper.java:

MapFragment mapFragment = new MapFragment();
mapFragment.updateMap();

Below are the files:

MapFragment.java:

public class MapFragment extends Fragment {
MapView mMapView;
private GoogleMap googleMap;
TextView propertyType, address;
LatLng latLng;
String PropertyType, Address;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    Log.d("PAVAN", "Inside map create");

    // inflat and return the layout
    View v = inflater.inflate(R.layout.fragment_map, container,
            false);

    mMapView = (MapView) v.findViewById(R.id.mapView);
    mMapView.onCreate(savedInstanceState);

    mMapView.onResume();// needed to get the map to display immediately

    try {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    googleMap = mMapView.getMap();

    googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter(){

        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View v = inflater.inflate(R.layout.custom_window_adapter, null);

            Log.d("PAVAN", "inside getInfoWindow");

            propertyType = (TextView) v.findViewById(R.id.PropertyType);
            address = (TextView) v.findViewById(R.id.Address);
            TextView loanAmount = (TextView) v.findViewById(R.id.loanAmount);
            TextView APR = (TextView) v.findViewById(R.id.APR);
            TextView monthlyPayment = (TextView) v.findViewById(R.id.monthlyPayment);

            String separateTitle = marker.getTitle();
            Log.d("VANSH", "Separate Title"+separateTitle);
            String[] titleParts;

            titleParts = separateTitle.split("-");

            propertyType.setText(titleParts[0]);
            address.setText(titleParts[1]);
            loanAmount.setText(titleParts[2]);
            APR.setText(titleParts[3]);
            monthlyPayment.setText(titleParts[4]);

            latLng = marker.getPosition();

            return v;
        }
    });


    updateMap();

    return v;
}


public void updateMap()
{
    Log.d("PAVAN", "Calling database helper from Map fragment to read data");
    DatabaseHelper databaseHelper = new DatabaseHelper(getContext(), null, null, 0);
    ArrayList<PropertyDetails> arrayList = databaseHelper.readData();

    if(arrayList.size() != 0)
    {
        for(int i = 0 ; i < arrayList.size() ; i++)
        {
            PropertyType = arrayList.get(i).PropertyType;
            Address = arrayList.get(i).Address;
            String City = arrayList.get(i).City;
            Double LoanAmount = arrayList.get(i).LoanAmount;
            Double APR = arrayList.get(i).APR;
            Double MonthlyPayment = arrayList.get(i).MonthlyPayment;
            Double Latitude = arrayList.get(i).getLatitude();
            Double Longitude = arrayList.get(i).getLongitude();

            LatLng latlang = new LatLng(Latitude, Longitude);
            Marker marker = googleMap.addMarker(new MarkerOptions()
                    .position(latlang)
                    .title(PropertyType+"-"+Address+"-"+LoanAmount+"-"+APR+"-"+MonthlyPayment)
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
            Log.d("PAVAN", "calling show info window");

            googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    marker.showInfoWindow();
                    return true;
                }
            });


            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));
        }
    }
    else {

        // latitude and longitude
        double Latitude = 17.385044;
        double Longitude = 78.486671;


        LatLng latlang = new LatLng(Latitude, Longitude);
        Marker marker = googleMap.addMarker(new MarkerOptions()
                .position(latlang)
                .title("Default-Default-0-0-0")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
        Log.d("PAVAN", "calling show info window");


        googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                marker.showInfoWindow();
                return true;
            }
        });

        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
        googleMap.animateCamera(CameraUpdateFactory
                .newCameraPosition(cameraPosition));

    }

}

@Override
public void onResume() {
    super.onResume();
    mMapView.onResume();
}

@Override
public void onPause() {
    super.onPause();
    mMapView.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mMapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mMapView.onLowMemory();
}

}

DatabaseHelper.java:

    public class DatabaseHelper extends SQLiteOpenHelper
{
    SQLiteDatabase sqLiteDatabase;
    private static final String databaseName = "MortgageCalculatorDatabase.db";
    private static final int databaseVersion = 11;
    private static final String tableName = "PropertyTable";
    DatabaseHelper databaseHelper;


    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
    {
        super(context, databaseName, factory, databaseVersion);
        databaseHelper = this;
    }

    public DatabaseHelper getObject()
    {
        return databaseHelper;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase)
    {
        Log.d("PAVAN", "Inside create table");
        String query = "CREATE TABLE IF NOT EXISTS " + tableName + "(PropertyType TEXT, Address TEXT, City TEXT, LoanAmount DOUBLE, APR DOUBLE, MonthlyPayment DOUBLE, Latitude DOUBLE, Longitude DOUBLE)";
        sqLiteDatabase.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
    {
        Log.d("PAVAN", "Inside upgrade");
        String query = "DROP TABLE IF EXISTS " + tableName;
        sqLiteDatabase.execSQL(query);

        onCreate(sqLiteDatabase);
    }


    public boolean addPropertyInfo(String PropertyType, String Address, String City, Double LoanAmount, Double APR, Double MonthlyPayment, Double Latitude, Double Longitude)
    {
        sqLiteDatabase = databaseHelper.getWritableDatabase();

        Log.d("PAVAN", "inside Add property info");
        try
        {
            ContentValues contentValues = new ContentValues();
            contentValues.put("PropertyType", PropertyType);
            contentValues.put("Address", Address);
            contentValues.put("City", City);
            contentValues.put("LoanAmount", LoanAmount);
            contentValues.put("APR", APR);
            contentValues.put("MonthlyPayment", MonthlyPayment);
            contentValues.put("Latitude", Latitude);
            contentValues.put("Longitude", Longitude);

            sqLiteDatabase.insert(tableName, null, contentValues);

            MapFragment mapFragment = new MapFragment();
            mapFragment.updateMap();

            return true;
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }
    }


    public ArrayList<PropertyDetails> readData()
    {
        Log.d("PAVAN", "Inside read data");

        Log.d("PAVAN", "Current object"+this.getClass().getName());

        sqLiteDatabase = databaseHelper.getReadableDatabase();

        String query = "SELECT * FROM " + tableName;
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);

        ArrayList<PropertyDetails> adapter = new ArrayList<>();

        Log.d("PAVAN", "Cursor count "+cursor.getCount());

        if (cursor != null && cursor.getCount() !=0)
        {
            cursor.moveToFirst();

            do
            {
                String PropertyType = cursor.getString(cursor.getColumnIndex("PropertyType"));
                String Address = cursor.getString(cursor.getColumnIndex("Address"));
                String City = cursor.getString(cursor.getColumnIndex("City"));
                Double LoanAmount = cursor.getDouble(cursor.getColumnIndex("LoanAmount"));
                Double APR = cursor.getDouble(cursor.getColumnIndex("APR"));
                Double MonthlyPayment = cursor.getDouble(cursor.getColumnIndex("MonthlyPayment"));
                Double Latitude = cursor.getDouble(cursor.getColumnIndex("Latitude"));
                Double Longitude = cursor.getDouble(cursor.getColumnIndex("Longitude"));

                PropertyDetails propertyDetails = new PropertyDetails();
                propertyDetails.setPropertyType(PropertyType);
                propertyDetails.setAddress(Address);
                propertyDetails.setCity(City);
                propertyDetails.setLoanAmount(LoanAmount);
                propertyDetails.setAPR(APR);
                propertyDetails.setMonthlyPayment(MonthlyPayment);
                propertyDetails.setLatitude(Latitude);
                propertyDetails.setLongitude(Longitude);


                adapter.add(propertyDetails);

            }while (cursor.moveToNext());

            cursor.close();

            return adapter;
        }

        return adapter;
    }
}

CalculationFragment.java:

    public class CalculationFragment extends Fragment
{

    String globalAddress;
    double lat, lng;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_calculation, container, false);

        final PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)getActivity().getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
        //final String globalAdd = new String();
        final EditText price = (EditText)rootView.findViewById(R.id.editTextPropertyPrice);
        final EditText downPayment = (EditText)rootView.findViewById(R.id.editTextDownPayment);
        final EditText apr = (EditText)rootView.findViewById(R.id.editTextAPR);
        final Spinner years = (Spinner)rootView.findViewById(R.id.spinnerYears);

        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.
                Log.i("Vansh", "Place: " + place.getName());
                Log.i("Vansh", "Place: " + place.getAddress().toString());
                //CharSequence addressCS = place.getAddress();
                Geocoder geocoder = new Geocoder(getContext());
                //String[] address = place.getAddress().toString().split(",");
                try{

                    List<Address> addresses = geocoder.getFromLocation(place.getLatLng().latitude,place.getLatLng().longitude, 1);
                    //List<Integer> addresses = place.getPlaceTypes();
                    String city = addresses.get(0).getLocality();
                    String country = addresses.get(0).getCountryName();
                    String address = addresses.get(0).getAddressLine(0);
                    globalAddress = address;
                    Double latitude = addresses.get(0).getLatitude();
                    Double longitude = addresses.get(0).getLongitude();
                    lat = latitude;
                    lng = longitude;
                    String zip = addresses.get(0).getPostalCode();
                    String state = addresses.get(0).getAdminArea();
                    Log.i("Vansh", "City: " + city);
                    Log.i("Vansh", "State: " + state);
                    Log.i("Vansh", "Country: " + country);
                    Log.i("Vansh", "Address: " + address);
                    Log.i("Vansh", "Lat: " + latitude);
                    Log.i("Vansh", "Long: " + longitude);
                    Log.i("Vansh", "Zip: " + zip);
                    //Log.i("Vansh", "Place: " + address[2]);

                    Spinner stateSpinner = (Spinner) rootView.findViewById(R.id.spinnerStates);

                    for(int i=0;i<stateSpinner.getCount();i++)
                    {
                        if(stateSpinner.getItemAtPosition(i).toString().equals(state))
                        {
                            stateSpinner.setSelection(i);
                            //return;
                        }
                    }

                    EditText cityEditText = (EditText)rootView.findViewById(R.id.editTextCity);
                    cityEditText.setText(city);
                    EditText zipEditText = (EditText)rootView.findViewById(R.id.editTextZipcode);
                    zipEditText.setText(zip);
                    //Log.i("Vansh", "thay che ahiya sudhi execute" + zipEditText.getText());



                }catch (Exception e)
                {
                    Log.i("Vansh", "Exception: " + e.getMessage());
                }



            }

            @Override
            public void onError(Status status) {
                // TODO: Handle the error.
                //Log.i(TAG, "An error occurred: " + status);
            }
        });

        Button calculate = (Button) rootView.findViewById(R.id.buttonCalculate);
        final Button newCalculation = (Button) rootView.findViewById(R.id.newCalculation);
        Button saveCalculation = (Button) rootView.findViewById(R.id.saveCalculation);

        calculate.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                //Log.i("Vansh", "Thayooooooooooooo" + price.toString());
                Double priceDbl = Double.parseDouble(price.getText().toString());
                //Log.i("Vansh", "Thayooooooooooooo1"+years.getSelectedItem().toString());
                Double downPaymentDbl = Double.parseDouble(downPayment.getText().toString());
                //Log.i("Vansh", "Thayooooooooooooo2");
                Double aprDbl = Double.parseDouble(apr.getText().toString());
                //Log.i("Vansh", "Thayooooooooooooo3");

                //Log.i("Vansh", "price " + priceDbl);
                ///Log.i("Vansh", "downpayment " + downPaymentDbl);
                ///Log.i("Vansh", "apr " + aprDbl);
                Double rate = Math.pow(1+((Double.parseDouble(apr.getText().toString()))/(100*12)),12*Double.parseDouble(years.getSelectedItem().toString()));
                //Log.i("Vansh", "rate: " + rate);
                Double result = (priceDbl-downPaymentDbl)*((rate*(aprDbl/(100*12)))/(rate-1));
                int output = (int)Math.round(result);
                TextView resultText = (TextView)rootView.findViewById(R.id.textViewResult);
                resultText.setText(Integer.toString(output));


            }
        });

        newCalculation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            ((EditText) rootView.findViewById(R.id.editTextAPR)).getText().clear();
            ((EditText) rootView.findViewById(R.id.editTextCity)).getText().clear();
            ((EditText) rootView.findViewById(R.id.editTextZipcode)).getText().clear();
            ((EditText) rootView.findViewById(R.id.editTextPropertyPrice)).getText().clear();
            ((EditText) rootView.findViewById(R.id.editTextDownPayment)).getText().clear();
            ((Spinner) rootView.findViewById(R.id.spinnerStates)).setSelection(0);
            ((Spinner) rootView.findViewById(R.id.spinnerYears)).setSelection(0);
            //int radio = ((RadioGroup)rootView.findViewById(R.id.radioGroupPropertyType)).getCheckedRadioButtonId();
            autocompleteFragment.setText("");
        }});

        saveCalculation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.i("Vansh", "savecalc 1");
                DatabaseHelper db = new DatabaseHelper(getContext(), null, null,0);
                Log.i("Vansh", "savecalc 2");
                //String PropertyType, String Address, String City, Double LoanAmount, Double APR, Double MonthlyPayment, Double Latitude, Double Longitude
                RadioGroup rg = (RadioGroup)rootView.findViewById(R.id.radioGroupPropertyType);
                Log.i("Vansh", "savecalc 3");
                String propertyType = ((RadioButton)rootView.findViewById(rg.getCheckedRadioButtonId())).getText().toString();
                Log.i("Vansh", "savecalc 4");
                //String address = autocompleteFragment.getText(0).toString();
                String add = autocompleteFragment.toString();
                Log.i("Vansh", "savecalc 5");
                String city = ((EditText) rootView.findViewById(R.id.editTextCity)).getText().toString();
                Double priceDbl = Double.parseDouble(price.getText().toString());
                Log.i("Vansh", "savecalc 6");

                Double downPaymentDbl = Double.parseDouble(downPayment.getText().toString());
                Log.i("Vansh", "savecalc 7");
                double loanAmount = priceDbl-downPaymentDbl;
                Log.i("Vansh", "savecalc 8");
                double apr = Double.parseDouble(((EditText) rootView.findViewById(R.id.editTextAPR)).getText().toString());
                Log.i("Vansh", "savecalc 9");
                double result = Double.parseDouble(((TextView)rootView.findViewById(R.id.textViewResult)).getText().toString());
                Log.i("Vansh", "savecalc 10");

                Log.d("PAVAN", "Save calculation");

                db.addPropertyInfo(propertyType, globalAddress, city, loanAmount, apr, result, lat, lng);
            }
        });


        return rootView;
    }

}

This is the error message in stack trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

pavan shah
  • 129
  • 2
  • 13
  • you posted a lot of code but the important one is the line of the crash, where is it? – lelloman Mar 19 '17 at 22:31
  • You can't handle a `Fragment` like that. The new instance you create there and call `updateMap()` on is not the one that's loaded and on-screen. – Mike M. Mar 19 '17 at 22:46
  • These 2 lines are throwing error, Can you suggest a correction? mapFragment = new MapFragment(); mapFragment.updateMap(); – pavan shah Mar 19 '17 at 23:45

0 Answers0