Курсор 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 3

2 ответа:

Вы уверены, что используете unixtime (секунды с момента epoch), а не, например, системное время Java (миллисекунды с момента epoch)?

Например, unixtime 1387233645 хорошо вписывается в 32-разрядный int.

Однако, миллисекунды штамп 1387233645000 является слишком большой для 32 бит. В hex это 0x142fd9191c8. Принимая нижние 32 бита, мы получаем 0xfd9191c8, который является -40791608 в десятичной системе счисления, когда интерпретируется как Java int, т. е. знаковое дополнение двух 32-битных целых чисел.

Значение, введенное в это поле базы данных, должно быть больше 2^31-1, т. е. максимальное положительное значение int. Поскольку тип int является целым числом со знаком, если самый левый бит (позиция 32) равен 1, это значение интерпретируется как отрицательное.

Когда вы загружаете значение как long, все биты интерпретируются по-разному, чтобы означать положительное длинное число.