SQLiteConstraintException:REAL 字段上的 NOT NULL 约束失败
SQLiteConstraintException: NOT NULL constraint failed on a REAL field
我收到了一段通常有效的代码的崩溃报告。
异常在insertOrThrow中启动,是:"Exception android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: HISTORY.altitude (code 1299)".
所有字段在 Table 中声明为 NOT NULL,特别是 HISTORY.altitude 字段声明为 "REAL NOT NULL"
我不明白它怎么可能是 NULL,因为我在插入命令中填了几行。
有人知道这是怎么可能的吗?
synchronized public void addSample( long time, int method, float altitude, int accuracy )
{
...
ContentValues cv = new ContentValues();
long day = new TimeUtils.Day(time).getMillis();
cv.put(MetaData.COLUMN_DAY, day);
cv.put(MetaData.COLUMN_TIME, time);
cv.put(MetaData.COLUMN_ALTITUDE, altitude);
cv.put(MetaData.COLUMN_METHOD, method);
cv.put(MetaData.COLUMN_ACCURACY, accuracy);
long id = latestSample.mId;
id = mDb.insertOrThrow(MetaData.TABLE_NAME, null, cv); // <--- Here crash
...
}
这里的代码用来定义table:
/* Inner class that defines the table contents */
public static abstract class MetaData implements BaseColumns
{
public static final String TABLE_NAME = "HISTORY";
public static final String COLUMN_DAY = "day";
public static final String COLUMN_TIME = "time";
public static final String COLUMN_ALTITUDE = "altitude";
public static final String COLUMN_METHOD = "method";
public static final String COLUMN_ACCURACY = "accuracy";
}
private static final String SQL_CREATE_HISTORY_TABLE =
"CREATE TABLE " + MetaData.TABLE_NAME + " ( " +
MetaData._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
MetaData.COLUMN_DAY + " INTEGER NOT NULL, " +
MetaData.COLUMN_TIME + " INTEGER NOT NULL, " +
MetaData.COLUMN_ALTITUDE + " REAL NOT NULL, " +
MetaData.COLUMN_METHOD + " INTEGER NOT NULL, " +
MetaData.COLUMN_ACCURACY + " INTEGER NOT NULL " +
" );\n" +
"CREATE INDEX " + MetaData.COLUMN_METHOD + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_METHOD + ");\n" +
"CREATE INDEX " + MetaData.COLUMN_DAY + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_DAY + ");\n" +
"CREATE INDEX " + MetaData.COLUMN_TIME + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_TIME + ");";
SQLite 不允许 NaN 的浮点值,并将它们视为 NULL。
因此,如果您的 float
值最终以某种方式成为 NaN,它将违反 NOT NULL 约束。
我收到了一段通常有效的代码的崩溃报告。
异常在insertOrThrow中启动,是:"Exception android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: HISTORY.altitude (code 1299)".
所有字段在 Table 中声明为 NOT NULL,特别是 HISTORY.altitude 字段声明为 "REAL NOT NULL"
我不明白它怎么可能是 NULL,因为我在插入命令中填了几行。
有人知道这是怎么可能的吗?
synchronized public void addSample( long time, int method, float altitude, int accuracy )
{
...
ContentValues cv = new ContentValues();
long day = new TimeUtils.Day(time).getMillis();
cv.put(MetaData.COLUMN_DAY, day);
cv.put(MetaData.COLUMN_TIME, time);
cv.put(MetaData.COLUMN_ALTITUDE, altitude);
cv.put(MetaData.COLUMN_METHOD, method);
cv.put(MetaData.COLUMN_ACCURACY, accuracy);
long id = latestSample.mId;
id = mDb.insertOrThrow(MetaData.TABLE_NAME, null, cv); // <--- Here crash
...
}
这里的代码用来定义table:
/* Inner class that defines the table contents */
public static abstract class MetaData implements BaseColumns
{
public static final String TABLE_NAME = "HISTORY";
public static final String COLUMN_DAY = "day";
public static final String COLUMN_TIME = "time";
public static final String COLUMN_ALTITUDE = "altitude";
public static final String COLUMN_METHOD = "method";
public static final String COLUMN_ACCURACY = "accuracy";
}
private static final String SQL_CREATE_HISTORY_TABLE =
"CREATE TABLE " + MetaData.TABLE_NAME + " ( " +
MetaData._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
MetaData.COLUMN_DAY + " INTEGER NOT NULL, " +
MetaData.COLUMN_TIME + " INTEGER NOT NULL, " +
MetaData.COLUMN_ALTITUDE + " REAL NOT NULL, " +
MetaData.COLUMN_METHOD + " INTEGER NOT NULL, " +
MetaData.COLUMN_ACCURACY + " INTEGER NOT NULL " +
" );\n" +
"CREATE INDEX " + MetaData.COLUMN_METHOD + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_METHOD + ");\n" +
"CREATE INDEX " + MetaData.COLUMN_DAY + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_DAY + ");\n" +
"CREATE INDEX " + MetaData.COLUMN_TIME + " ON " + MetaData.TABLE_NAME + " (" + MetaData.COLUMN_TIME + ");";
SQLite 不允许 NaN 的浮点值,并将它们视为 NULL。
因此,如果您的 float
值最终以某种方式成为 NaN,它将违反 NOT NULL 约束。