I am trying to compare values of lat long provided by user with values of lat long from database. If they are in 15 km radius of each other textview should be changed. But i am facing following error,
My database contains value source lat = 19.218418 source long = 73.08661 Des lat = 18.9766017 des long = 72.8326658. and values provided by user are soure lat = 19.2213935 source long= 73.081532 des lat = 18.9632933 des long = 72.8324848.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hitesh.nearby, PID: 2156
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.view.View$DeclaredOnClickListener.onClick(View.java:5347)
at android.view.View.performClick(View.java:6267)
at android.view.View$PerformClick.run(View.java:24763)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6548)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:5342)
at android.view.View.performClick(View.java:6267)
at android.view.View$PerformClick.run(View.java:24763)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6548)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available
Result.java
public class result extends Activity {
DatabaseHelper myDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
myDb = new DatabaseHelper(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_result);
String url = getIntent().getExtras().getString("username");
String url1 = getIntent().getExtras().getString("username1");
TextView tv= (TextView)findViewById(R.id.textView2);
TextView tv1= (TextView)findViewById(R.id.textView5);
String[] separated = url.split("_");
String srclat = separated[0];
Double dsrclat= Double.parseDouble(srclat);
String srclng = separated[1];
Double dsrclng= Double.parseDouble(srclng);
String[] separated1 = url.split("_");
String deslat = separated1[0];
Double ddeslat= Double.parseDouble(deslat);
String deslng = separated1[1];
Double ddeslng= Double.parseDouble(deslng);
tv.setText(url);
tv1.setText(url1);
}
public void Database(View view){
Intent intent = new Intent(result.this, feeder.class);
startActivity(intent);
}
public void NearestValue(View view){
TextView tv= (TextView)findViewById(R.id.textView2);
String s1 = tv.getText().toString();
String[] separated = s1.split("_");
String deslat = separated[0];
Double Lat= Double.parseDouble(deslat);
String deslng = separated[1];
Double Lng= Double.parseDouble(deslng);
ArrayList<String> ssList = new ArrayList<>();
ssList = myDb.countDatabase(Lat,Lng);
int ssize = ssList.size();
TextView tvvv = (TextView) findViewById(R.id.textView8);
for(int i=0;i<ssize;i++) {
tvvv.setText(ssList.get(i));
}
TextView tv1= (TextView)findViewById(R.id.textView5);
String s11 = tv1.getText().toString();
String[] separated1 = s11.split("_");
String deslat1 = separated1[0];
Double Lat1= Double.parseDouble(deslat1);
String deslng1 = separated1[1];
Double Lng1= Double.parseDouble(deslng1);
ArrayList<String> ddList = new ArrayList<>();
ddList = myDb.countDatabase1(Lat1,Lng1);
int dsize = ddList.size();
TextView tvvvv = (TextView) findViewById(R.id.textView9);
for(int i=0;i<dsize;i++) {
tvvv.setText(ddList.get(i));
}
for(int i=0;i<ssize;i++){
String source = ssList.get(i);
for(int j=0;j<dsize;j++) {
String destination = ddList.get(j);
String src = myDb.findBus(source, destination);
TextView tvv = (TextView) findViewById(R.id.textView7);
tvv.setText(src);
}
}
}
}
DatabaseHelper
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Nearby.db";
public static final String TABLE_NAME = "halt_details";
public static final String COL_2 = "snme";
public static final String COL_3 = "slati";
public static final String COL_4 = "slong";
public static final String COL_5 = "dnme";
public static final String COL_6 = "dlati";
public static final String COL_7 = "dlong";
public static final String COL_8 = "buses";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, snme VARCHAR, slati DOUBLE, slong DOUBLE, dnme VARCHAR, dlati DOUBLE, dlong DOUBLE, buses VARCHAR)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public void insertData(String sname, Double slat, Double slng, String dname, Double dlat, Double dlng, String bus) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("snme",sname);
contentValues.put("slati",slat);
contentValues.put("slong",slng);
contentValues.put("dnme",dname);
contentValues.put("dlati",dlat);
contentValues.put("dlong",dlng);
contentValues.put("buses",bus);
db.insert(TABLE_NAME,null ,contentValues);
}
public void clearDatabase() {
SQLiteDatabase db = this.getWritableDatabase();
String clearDBQuery = "DELETE FROM "+TABLE_NAME;
db.execSQL(clearDBQuery);
}
public ArrayList<String> countDatabase(Double LAT, Double LNG) {
String sourcename=null;
double earthRadius = 6371.75;
ArrayList<String> sList = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
mCount.moveToNext();
while (mCount.moveToFirst()) {
double Latitude = mCount.getDouble(2);
double Longitude = mCount.getDouble(3);
double dLat = Math.toRadians(Latitude-LAT);
double dLng = Math.toRadians(Longitude-LNG);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
if (dist<15){
sourcename=mCount.getString(1);
sList.add(sourcename);
}
}
mCount.close();
return sList;
}
public ArrayList<String> countDatabase1(Double LAT, Double LNG) {
String destinationname=null;
ArrayList<String> dList = new ArrayList<>();
double earthRadius = 6371.75;
SQLiteDatabase db = this.getWritableDatabase();
Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
mCount.moveToFirst();
while (mCount.moveToNext() ) {
double Latitude = mCount.getDouble(2);
double Longitude = mCount.getDouble(3);
double dLat = Math.toRadians(Latitude-LAT);
double dLng = Math.toRadians(Longitude-LNG);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
if (dist<15){
destinationname = mCount.getString(4);
dList.add(destinationname);
}
}
mCount.close();
return dList;
}
public String findBus(String sourcename, String desname){
SQLiteDatabase db = this.getWritableDatabase();
Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
mCount.moveToFirst();
String src= mCount.getString(1);
mCount.close();
return src;
}
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
return res;
}
}
I'd suggest that you have a few issues within the findBus
method and the loops that invoke it.
The 3 loops around the invocation of the findBus
method appear to be useless as they repeatedly set the TextView
but only the last will likely be visible and thus usable. You could go directly to the last element of the ArrayList
's by using their size
method.
I'd suggest that the following :-
tvvv.setText(ddList.get(ddList.size()-1));
TextView tvv = (TextView) findViewById(R.id.textView7);
tvv.setText(myDB.findBus(ssList.get(ssList.size()-1),ddList.get(ddList.size()-1)));
should replace :-
for(int i=0;i<dsize;i++) {
tvvv.setText(ddList.get(i));
}
for(int i=0;i<ssize;i++){
String source = ssList.get(i);
for(int j=0;j<dsize;j++) {
String destination = ddList.get(j);
String src = myDb.findBus(source, destination);
TextView tvv = (TextView) findViewById(R.id.textView7);
tvv.setText(src);
}
}
}
Additionally within the findBus method you are attempting to access the 2nd column returned from the query, when the query returns only 1 column. i.e. you have coded offset 1 whilst only offset 0 (column count(*)) is the only available column.
I'd suggest changing the findBus
method to :-
public String findBus(String sourcename, String desname){
SQLiteDatabase db = this.getWritableDatabase();
Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
mCount.moveToFirst();
String src= mCount.getString(0); //<<<< Changed offset to 0 from 1
mCount.close();
return src;
}
This would likely reduce the memory requirements, if by enough I have no idea though. However, you may also wish to check the Related links display to the right in regards to OOM (Out of Memory errors, perhaps the one with (Andorid)).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With