起初我想注意英语不是我的母语,不管我希望我们不会有任何误导的话语
我在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有什么问题吗?
答案 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
时,所有位的解释都不同,表示正数。