【发布时间】:2019-01-26 11:39:42
【问题描述】:
我在以下代码中遇到错误。我试图在 SQLite 数据库中保存我的行进距离,但在 SQLite 数据库中出现错误。我不知道如何管理数组长度。我收到一个名为
的错误java.lang.ArrayIndexOutOfBoundsException: length=3;索引=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)]);
提前致谢。
【问题讨论】:
-
如果数组的大小为3,那么只能用索引0、1、2访问
-
cursor的内容是什么? -
@Jens 光标内容:
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); -
能否请您显示SQL语句
-
@MikeM。你的权利。我得到了解决方案。感谢您的建议和时间。
标签: java android arrays sqlite indexoutofboundsexception