0

私のプログラムには、アプリケーションにGoogleマップのGPS座標を保存するSQLiteがあります。緯度と経度を取得してarrayListに格納しようとしましたが、プログラムを実行すると、プログラムはindexOutOfBoundsExceptionをスローします。これは、arrayListからアイテムを取得しようとしたときに、arrayListに何もないことを意味することを漠然と理解していますが、間違っている場合は修正してください。

LogCat

01-22 14:39:54.750: E/AndroidRuntime(21639): FATAL EXCEPTION: main
01-22 14:39:54.750: E/AndroidRuntime(21639): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidbasic12/com.example.androidbasic12.map}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.os.Looper.loop(Looper.java:137)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread.main(ActivityThread.java:4511)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at java.lang.reflect.Method.invokeNative(Native Method)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at java.lang.reflect.Method.invoke(Method.java:511)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at dalvik.system.NativeStart.main(Native Method)
01-22 14:39:54.750: E/AndroidRuntime(21639): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
01-22 14:39:54.750: E/AndroidRuntime(21639):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at java.util.ArrayList.get(ArrayList.java:304)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at com.example.androidbasic12.map.onCreate(map.java:58)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at  android.app.Activity.performCreate(Activity.java:4470)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
01-22 14:39:54.750: E/AndroidRuntime(21639):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
01-22 14:39:54.750: E/AndroidRuntime(21639):    ... 11 more

クラス「DatabaseHandler.class」の生のクエリ

    public Cursor getLatLng(){
    SQLiteDatabase db = this.getReadableDatabase();
    String query = ("SELECT * FROM " + TABLE_CARCOORD + " WHERE name = " + CAR_KEY_NAME);
    Cursor cursor = db.rawQuery(query, null);
    return cursor;

}

クラス「UserFunction.class」

    public ArrayList<String> getCoords(Context context, String lat, String lng) {
    DatabaseHandler db = new DatabaseHandler(context);
    Cursor cursor = db.getLatLng();
    ArrayList<String> cordarr = new ArrayList<String>();
    if (cursor.moveToFirst()){
        lat = cursor.getString(cursor.getColumnIndex("lat"));
        lng = cursor.getString(cursor.getColumnIndex("lng"));
        cordarr.add(lat);
        cordarr.add(lng);
    }
cursor.close();
db.close();
return cordarr;
}

map.class

    UserFunctions userFunc = new UserFunctions();
    ArrayList<String> cordarr = new ArrayList<String>();
    cordarr = userFunc.getCoords(getApplicationContext(), Lat1, Lng1);
    Lat1 = cordarr.get(0);
    Lng1 = cordarr.get(1);
    lat = goDouble(Lat1);
    lng  = goDouble(Lng1);
    LatLng sala = new LatLng(lat, lng);

文字列を受け取り、googlemapsで使用するためにdoubleに変換する関数

    public Double goDouble(String Latlng) {
    Double goDouble = Double.parseDouble(Latlng);
    return goDouble;
}
4

3 に答える 3

0

カーソルを反復してみてください。

if(cursor!=null)
 {
    cursor.moveToFirst();
    do {
    lat = cursor.getString(cursor.getColumnIndex("lat"));
    lng = cursor.getString(cursor.getColumnIndex("lng"));
    cordarr.add(lat);
    cordarr.add(lng);
   }while(cursor.moveToNext()); //It will move to next value.
  } 
于 2013-01-22T14:03:05.187 に答える
0

あなたが書いた:

    if (cursor.moveToFirst()){
           lat = cursor.getString(cursor.getColumnIndex("lat"));
           lng = cursor.getString(cursor.getColumnIndex("lng"));
           cordarr.add(lat);
           cordarr.add(lng);
     }

しかし、カーソルを最初の位置にしっかりと設定する必要があります。または、カーソルが最初にある場合にのみデータを取得したいですか? そうでない場合は、電話してください

        cursor.moveToFirst();

次に、データを取得しますが、if 句内で:

          if (cursor.moveToFirst()){
    lat = cursor.getString(cursor.getColumnIndex("lat"));
    lng = cursor.getString(cursor.getColumnIndex("lng"));
    cordarr.add(lat);
    cordarr.add(lng);

     cursor.moveToNext(); //call this, so the cursor goes to the next
}  
于 2013-01-22T13:57:56.873 に答える
0

ここでnullチェックを行う必要があります。

    public ArrayList<String> getCoords(Context context, String lat, String lng) {
        DatabaseHandler db = new DatabaseHandler(context);
        Cursor cursor = db.getLatLng();
        if (cursor !null && cursor.moveToFirst()){
              ArrayList<String> cordarr = new ArrayList<String>();
            lat = cursor.getString(cursor.getColumnIndex("lat"));
            lng = cursor.getString(cursor.getColumnIndex("lng"));
            cordarr.add(lat);
            cordarr.add(lng);
            return cordarr;
        }
    cursor.close();
    db.close();
    return null;
    }

そしてここでも、

    UserFunctions userFunc = new UserFunctions();
    ArrayList<String> cordarr = new ArrayList<String>();
    cordarr = userFunc.getCoords(getApplicationContext(), Lat1, Lng1);
    if(cordarr != null && cordarr.size() > 1) {
    Log.d("LOG","have got lat long to show.")
    Lat1 = cordarr.get(0);
    Lng1 = cordarr.get(1);
    lat = goDouble(Lat1);
    lng  = goDouble(Lng1);
    LatLng sala = new LatLng(lat, lng); 
    } else {
        Log.d("LOG","no lat long found")
    }

これを試して、取得しているログを確認してください

于 2013-01-22T14:08:38.343 に答える