【发布时间】:2014-09-26 10:26:18
【问题描述】:
我有一个由四列组成的 SQLite 数据库 - ID、WindSpeed、经度和纬度。
我正在做的是,使用 GPS 获取使用 Android 位置服务的用户的纬度和经度,然后使用数据库查询该位置的纬度和经度以找到该位置的风速。
但正如我提到的,我遇到了一点问题,如果我在表中使用正确的纬度和经度,我的查询就可以工作,但我需要做的是找到最近的经度和经度以及由此产生的风速用户当前位置。
因此,如果纬度和经度分别为 51.652161 和 -3.0567927,它将在我的数据库中找到与这两个值最接近的值,并返回该行的结果风速。
所以我输入我当前的纬度和经度,它会在这两个相遇的表中找到最接近这些的值,然后给出它们相遇的风速值。
这是我的代码
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "WindSpeed.sqlite";
private static final int DATABASE_VERSION = 1;
private static final String LAT_VAL = "Latitude";
private static final String LONG_VAL = "Longitude";
private static final String WIND_SPEED= "Windspeed";
private static final String ROW_ID= " _id";
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public Double getWindSpeed2(){
double Long = postcodeInput.getlng();
double Lat = postcodeInput.getlat();
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String [] sqlSelect = {ROW_ID,WIND_SPEED,LAT_VAL,LONG_VAL};
String sqlTables = "WindSpeed";
String whereClause = LAT_VAL+" = ? AND "+ LONG_VAL +" = ?";
String[] whereArgs = new String[] {
String.valueOf(Lat),
String.valueOf(Long)
};
qb.setTables(sqlTables);
Cursor d = qb.query(db, sqlSelect, whereClause, whereArgs,
null, null, null);
if (d != null ){
d.moveToFirst();
String Windd = d.getString(1);
double win_d = 0.0;
win_d= Double.parseDouble(Windd);
return win_d;
}
return null;
}
}
如果 lat 和 long 字符串的值导致问题,这些可以在我的数据库中转换为双精度值。
任何帮助将不胜感激,因为我在一个真正的泡菜中
我已经搜索过类似问题的高低搜索,并且很多人提到了havernsine forumla,但我不确定我的id是如何实现的。 谢谢
编辑
所以我试图实现什么laborno但我无法让它在这里工作是我正在使用的代码!
我必须使用两个游标还是更改我的数据库?
公共类 MyDatabase 扩展 SQLiteAssetHelper {
private static final String DATABASE_NAME = "WindSpeed.sqlite";
private static final int DATABASE_VERSION = 1;
private static final String LAT_VAL = "Latitude";
private static final String LONG_VAL = "Longitude";
private static final String WIND_SPEED= "Windspeed";
private static final String ROW_ID= " _id";
private static final double Lat= 58.0745976;
private static final double Long= -5.3846407;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public Double getWindSpeed2(){
double fudge = Math.pow(Math.cos(Math.toRadians(Lat)),2);
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String wind_speed=null;
double min_distance=99999999;
String [] sqlSelect = {WIND_SPEED,LAT_VAL,LONG_VAL};
String sqlTables = "WindSpeed";
String whereClause = " ? between "+LAT_VAL+"- 0.1 and "+LAT_VAL+" + 0.1 and ? between "+LONG_VAL+" - 0.1 and "+LONG_VAL+" + 0.1";
String[] whereArgs = new String[] {
String.valueOf(Lat),
String.valueOf(Long)};
qb.setTables(sqlTables);
Cursor d = qb.query(db, sqlSelect, whereClause, whereArgs,
null, null, null);
if (d != null ){
d.moveToFirst();
double lat_v =Double.parseDouble(d.getString(3));
double long_v=Double.parseDouble(d.getString(2));
double dis = (Math.sqrt(lat_v-Lat)*(lat_v-Lat) + (long_v-Long)*(long_v-Long) );
if (dis < min_distance){
wind_speed=d.getString(1);
double windd = Double.parseDouble(wind_speed);
return windd;
}
}
return null;
}
}
但它似乎没有计算结果并且我得到错误。 以下是错误代码
08-04 12:51:32.007: E/AndroidRuntime(1458): FATAL EXCEPTION: main
08-04 12:51:32.007: E/AndroidRuntime(1458): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
08-04 12:51:32.007: E/AndroidRuntime(1458): at com.example.mobilegreenenergyevaluator.MyDatabase.getWindSpeed2(MyDatabase.java:80)
08-04 12:51:32.007: E/AndroidRuntime(1458): at com.example.mobilegreenenergyevaluator.postcodeInput$2.onClick(postcodeInput.java:67)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.view.View.performClick(View.java:4204)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.view.View$PerformClick.run(View.java:17355)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.os.Handler.handleCallback(Handler.java:725)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.os.Handler.dispatchMessage(Handler.java:92)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.os.Looper.loop(Looper.java:137)
08-04 12:51:32.007: E/AndroidRuntime(1458): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-04 12:51:32.007: E/AndroidRuntime(1458): at java.lang.reflect.Method.invokeNative(Native Method)
08-04 12:51:32.007: E/AndroidRuntime(1458): at java.lang.reflect.Method.invoke(Method.java:511)
08-04 12:51:32.007: E/AndroidRuntime(1458): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-04 12:51:32.007: E/AndroidRuntime(1458): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-04 12:51:32.007: E/AndroidRuntime(1458): at dalvik.system.NativeStart.main(Native Method)
08-04 12:51:34.327: E/Trace(1475): error opening trace file: No such file or directory (2)
【问题讨论】:
-
这些都在使用 MySql,我不确定 id 如何将其转换为 SQLite
-
要提出新问题,请使用“”按钮。
-
查询似乎没有得到结果。我更改了 IF 子句,因此它不会崩溃。另外,请尝试靠近数据库中现有位置的位置。
-
不知道为什么它不工作,我使用的位置是一个已经在数据库中的位置,所以它应该找到它。顺便说一句,您提供了很多帮助,我感谢您迄今为止所做的一切