Курсор 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
, все биты интерпретируются по-разному, чтобы означать положительное длинное число.