游标getInt返回负值

时间:2013-12-18 23:07:31

标签: android sql integer

起初我想注意英语不是我的母语,不管我希望我们不会有任何误导的话语

我在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);

现在......一切正常,我使用this application进行了验证,存储的数值都没问题。

然而,当我尝试使用cursor.getInt(cursor.getColumnIndex("date"))获取日期值时,我得到1)错误值2)其负数(如-1004124)

所以,我试着用getLong替换它,瞧!我得到了我的unix时间。

问题是 - 这里的getInt有什么问题吗?

2 个答案:

答案 0 :(得分:1)

你确定你正在使用unixtime(自纪元以来的秒数)而不是例如Java系统时间(自纪元以来的毫秒数)?

例如,unixtime 1387233645非常适合32位int。

但是,毫秒标记1387233645000对于32位来说太大了。在十六进制中它是0x142fd9191c8。取底部的32位为0xfd9191c8留下了小数-40791608,当被解释为Java int时,即带符号的二进制补码32位整数。

答案 1 :(得分:0)

您输入该数据库字段的值必须大于2 ^ 31-1,即。最大int正值。由于int类型是有符号整数,如果最左边的位(位置32)为1,则此值将被解释为负值。

当您将值加载为long时,所有位的解释都不同,表示正数。

相关问题