ホーム>source

次のコードでエラーが発生しました。移動距離をSQLiteデータベースに保存しようとしていますが、SQLiteデータベースでエラーが発生します。配列の長さを管理する方法がわかりません。というエラーが表示されます

java.lang.ArrayIndexOutOfBoundsException: length=3; index=4.

public class ActivityLocationDaoImpl extends Dao implements ActivityLocationDao {
private static final String TABLE_NAME = "activity_location";
private static final String COLUMN_ID = "id";
private static final String COLUMN_LATITUDE = "latitude";
private static final String COLUMN_LONGITUDE = "longitude";
private static final String COLUMN_ACTIVITY = "activity";
private static final String COLUMN_DATE = "date";
private static final String[] COLUMN_ARRAY = new String[]{COLUMN_ID, COLUMN_LATITUDE, COLUMN_LONGITUDE, COLUMN_ACTIVITY, COLUMN_DATE};
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (\n" +
        COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,\n" +
        COLUMN_LATITUDE + " INTEGER NOT NULL,\n" +
        COLUMN_LONGITUDE + " INTEGER NOT NULL,\n" +
        COLUMN_ACTIVITY + " INTEGER NOT NULL,\n" +
        COLUMN_DATE + " INTEGER NOT NULL\n" + ")";
public ActivityLocationDaoImpl(SQLiteDatabase database) {
    super(database);
}
@Override
public boolean insert(ActivityLocation activityLocation) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_LATITUDE, activityLocation.getLocation().getLatitude());
    contentValues.put(COLUMN_LONGITUDE, activityLocation.getLocation().getLongitude());
    contentValues.put(COLUMN_ACTIVITY, activityLocation.getActivityType().getIndex());
    contentValues.put(COLUMN_DATE, activityLocation.getDate().getTime());
    return getDatabase().insert(TABLE_NAME, null, contentValues) != -1;
}
@Override
public List<ActivityLocation> listAll(Date currentDay) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(currentDay);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    currentDay = calendar.getTime();
    calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
    Date nextDay = calendar.getTime();
    Cursor cursor = getDatabase().query(TABLE_NAME, COLUMN_ARRAY, COLUMN_DATE + " > ? AND " + COLUMN_DATE + " < ?",
            new String[]{String.valueOf(currentDay.getTime()), String.valueOf(nextDay.getTime())},
            null, null, COLUMN_DATE + " ASC", null);
    List<ActivityLocation> activityLocationList = new ArrayList<>();
    while (cursor.moveToNext()) {
        activityLocationList.add(convertCursorToEntity(cursor));
    }
    return activityLocationList;
}
@Override
public List<ActivityLocation> listAll(Date startDate, Date finalDate) {
    Cursor cursor = getDatabase().query(TABLE_NAME, COLUMN_ARRAY, COLUMN_DATE + " > ? AND " + COLUMN_DATE + " < ?",
            new String[]{String.valueOf(startDate.getTime()), String.valueOf(finalDate.getTime())},
            null, null, COLUMN_DATE + " ASC", null);
    List<ActivityLocation> activityLocationList = new ArrayList<>();
    while (cursor.moveToNext()) {
        activityLocationList.add(convertCursorToEntity(cursor));
    }
    return activityLocationList;
}
public ActivityLocation convertCursorToEntity(Cursor cursor) {
    ActivityLocation activityLocation = new ActivityLocation();
    Location location = new Location();
    activityLocation.setId(cursor.getInt(0));
    location.setLatitude(cursor.getDouble(1));
    location.setLongitude(cursor.getDouble(2));
    activityLocation.setLocation(location);
    activityLocation.setActivityType(ActivityType.values()[cursor.getInt(3)]);
    activityLocation.setDate(new Date(cursor.getLong(4)));
    return activityLocation;
}

この行でエラーを取得:

activityLocation.setActivityType(ActivityType.values()[cursor.getInt(3)]);

前もって感謝します。

あなたの答え
  • 解決した方法 # 1

    ほとんどの場合、カーソルには3つの結果列のみが含まれます。したがって、アクセスできるのは0、1、および2のみです。

  • 解決した方法 # 2

    シュラバン、値が3つしかない場合、配列から4番目のインデックス値を取得できません。

    0、1、2のインデックス値にのみアクセスできます。

    クラッシュする行でブレークポイントを使用すると、明確な画像が得られます。

  • 解決した方法 # 3

    さて、3つの要素しか持たない配列の4番目の要素にはアクセスできません。ほとんどの人は、これをC/C ++の背景が少し混同していると混同します。 これは、C/C ++とJAVAの違いです。 次のようなものがあるとします:

    int arr[] = {1,2,3};
    
    

    現在、C/C ++でarr [3]を実行すると、その特定のアドレスに存在するガベージ値が返されますが、JAVAではArrayIndexOutOfBoundsExceptionがスローされます。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ machine learning - ランダムなトレイン/テストセットによる分類のためのモデル選択