Курсор getInt возвращает отрицательное значение
Во-первых, я хочу заметить, что английский не является моим родным языком, как бы я ни надеялся, что у нас не будет missunderstaning
Я пишу простое приложение на Android, и нашел проблему, также решил ее, но в любом случае я хочу понять, почему это было.
Я создал таблицу sql:
public static final String CREATE_TABLE_ENTRIES = " CREATE TABLE "
+ TABLE_ENTRIES + " ( " + KEY_ID + " TEXT PRIMARY KEY, "
+ " content " + " TEXT, "
+ " title" + " TEXT, "
+ " image " + " TEXT, "
+ " date " + " INTEGER, " + ")";
И поместить в него данные следующим образом:
SQLiteDatabase db = mStorage.getWritableDatabase();
ContentValues tempValues = new ContentValues();
tempValues.put("id", entry.id);
tempValues.put("content", entry.content);
tempValues.put("title", entry.title);
tempValues.put("image", entry.image);
tempValues.put("date", entry.date); // int date; I use Unix time
db.insert(contentType, null, tempValues);
Теперь.. все в порядке, я проверил с помощью этого приложения , что сохраненные значения все в порядке.
Тем не менее, когда я пытаюсь получить значение даты с помощью cursor.getInt(cursor.getColumnIndex("date")) я получаю 1) неправильное значение 2) его отрицательное (например, -1004124)
Итак, я попытался заменить его на getLong и вуаля! Я получаю свое время unix.
Вопрос в том, что не так с getInt здесь?
2 ответа:
Вы уверены, что используете unixtime (секунды с момента epoch), а не, например, системное время Java (миллисекунды с момента epoch)?
Например, unixtime
1387233645хорошо вписывается в 32-разрядный int.Однако, миллисекунды штамп
1387233645000является слишком большой для 32 бит. В hex это0x142fd9191c8. Принимая нижние 32 бита, мы получаем0xfd9191c8, который является-40791608в десятичной системе счисления, когда интерпретируется как Javaint, т. е. знаковое дополнение двух 32-битных целых чисел.
Значение, введенное в это поле базы данных, должно быть больше 2^31-1, т. е. максимальное положительное значение
int. Поскольку типintявляется целым числом со знаком, если самый левый бит (позиция 32) равен 1, это значение интерпретируется как отрицательное.Когда вы загружаете значение как
long, все биты интерпретируются по-разному, чтобы означать положительное длинное число.