Android 游标getInt返回负值
首先,我想注意到英语不是我的母语,不管怎样,我希望我们不会有误解 我在Android上编写了一个简单的应用程序,发现了一个问题,也解决了它,但无论如何,我想了解它的原因 我创建了一个sql表:Android 游标getInt返回负值,android,sql,integer,Android,Sql,Integer,首先,我想注意到英语不是我的母语,不管怎样,我希望我们不会有误解 我在Android上编写了一个简单的应用程序,发现了一个问题,也解决了它,但无论如何,我想了解它的原因 我创建了一个sql表: public static final String CREATE_TABLE_ENTRIES = " CREATE TABLE " + TABLE_ENTRIES + " ( " + KEY_ID + " TEXT PRIMARY KEY, " + " c
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和voila来代替它!我有时间
问题是-getInt在这里有什么问题?您在该数据库字段中输入的值必须大于2^31-1,即max
int
正值。由于int
type是一个有符号整数,如果最左边的位(位置32)是1,则该值被解释为负值
当您将值加载为
long
时,所有位的解释都不同,表示一个正长数。您确定使用的是unixtime(自历元起的秒数),而不是Java系统时间(自历元起的毫秒数)
例如,unixtime138723645
非常适合32位int
但是,毫秒戳
138723645000
对于32位来说太大。十六进制是0x142fd9191c8
。取下底部的32位,我们将得到0xfd9191c8
,当解释为Javaint
时,它是十进制的-40791608
,即有符号2的补码32位整数。您保存到该字段的值是多少?@Szymon我正在输入unix时间,正如我现在从wiki上知道的1387233645,所以,从2^32-1开始,它几乎不到两倍。我重新检查了这些值,并以毫秒为单位进行了存储。失败:D我也没有检查我的对象类型-它的long
和int
,就像我在问题中写的那样