【问题标题】:SQLiteConstraintException: NOT NULL constraint failed on a REAL fieldSQLiteConstraintException:NOT NULL 约束在 REAL 字段上失败
【发布时间】:2017-04-20 18:06:21
【问题描述】:

我收到了关于一段通常有效的代码的崩溃报告。

异常在 insertOrThrow 中启动,为:“Exception android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: HISTORY.altitude (code 1299)”。

表中的所有字段都声明为 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
    ...
}

这里是用来定义表格的代码:

/* 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 + ");";

【问题讨论】:

  • 您的高度值为空
  • @FlorescuGeorgeCătălin A float 值不能是 null。但它可能是 NaN。
  • @CL。是的,它可以是一个Long 对象在它的基础上。前段时间出现过这种错误。
  • 当它是原始浮动时不,因为它是(浮动高度)。
  • 是的,它是一个原始浮点数,不能为空。 @CL 我做了一个快速测试,如果我插入 NaN 我得到一个 NOT NULL 约束异常,所以这可能是原因......谢谢。如果您添加答案,我可以接受并关闭问题。

标签: android sqlite null android-sqlite nan


【解决方案1】:

SQLite 不允许 NaN 浮点值,并将它们视为 NULL。 因此,如果您的 float 值最终以某种方式变为 NaN,它将违反 NOT NULL 约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2018-08-24
    • 2022-01-19
    • 2021-11-16
    • 2020-12-18
    • 2021-03-20
    • 2020-06-08
    相关资源
    最近更新 更多