【问题标题】:SQLiteConstraintException: error code 19: constraint failed AndroidSQLiteConstraintException:错误代码 19:约束失败 Android
【发布时间】:2012-08-25 15:13:14
【问题描述】:

我正在尝试将经纬度坐标插入到 SQLite 表中,我得到了SQLiteConstraintException: error code 19: constraint failed。

我的代码被 try/catch 包围,没有抛出异常。我的 logcat 中出现约束错误。

我已附加 DB 类和来自我的主要活动的调用。任何帮助或指导将不胜感激!

这是我的 logcat 的前几行:

08-25 14:39:06.934: E/SQLiteDatabase(681): Error inserting lat=59310767 longi=-8613281
08-25 14:39:06.934: E/SQLiteDatabase(681): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
08-25 14:39:06.934: E/SQLiteDatabase(681):  at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
08-25 14:39:06.934: E/SQLiteDatabase(681):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
08-25 14:39:06.934: E/SQLiteDatabase(681):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1745)
08-25 14:39:06.934: E/SQLiteDatabase(681):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1618)

这是来自我的 DbHelper 的代码:

public void onCreate(SQLiteDatabase db) 
{
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
            KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            KEY_LAT + " REAL NOT NULL, " + 
            KEY_LONGI + " REAL NOT NULL)" 

            // KEY_NAME + " TEXT NULL, " +
            // KEY_INFO + " TEXT NULL);"
    );
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    onCreate(db);
}

这是我的数据库管理器

public DatabaseManager(Context c) {
    ourContext = c;
}

public DatabaseManager open() throws SQLException {
    ourHelper = new DbHelper(ourContext);
    ourDB = ourHelper.getWritableDatabase(); //example show writeable
    return this;
}

public void close() {
    ourHelper.close();
} 

public long createPin(long latitude, long longitude) {
    ContentValues cv = new ContentValues();
    cv.put(KEY_LAT, latitude);
    cv.put(KEY_LONGI, longitude);

    return ourDB.insert(DATABASE_TABLE, null, cv);
}

这是来自我的 MainActivity 的调用:

try{
    long longitude= touchedPoint.getLongitudeE6();
    long latitude= touchedPoint.getLatitudeE6();

    //Add Pin to the Database
    DatabaseManager db = new DatabaseManager(MainActivity.this);
    db.open();
    db.createPin(latitude,longitude);
    db.close();
}

【问题讨论】:

  • 您还有其他表或触发器吗?
  • 如果在插入之前将 long 值转换为 float 会发生什么?例如,在您的 createPin(...) 方法中,尝试 cv.put(KEY_LAT, latitude.floatValue()); 和相同的经度。
  • 好点 Squonk。与real类似的java数据类型是double。
  • 啊,我也考虑过建议doubleValue(),但我从未使用 REAL 作为列类型,因此不确定是否等效。
  • “Sam:不,我没有任何触发器。”但是您还有其他表(尤其是带有外键的表)吗?此外,在您的问题中使用此处的“添加评论”功能,您可以使用“@Sam”通知单个用户。我只是偶然发现了你的评论。

标签: android sqlite


【解决方案1】:

删除关键字AUTOINCREMENT。 sqlite 不是必需的。 如果您尝试将空值插入主整数键,则该字段会自动转换为比该列的最大值大一的整数。

此外,您必须清除模拟器上的应用数据。之后,您可以确定数据库是空的。

【讨论】:

  • 确实,INTEGER PRIMARY KEY 暗示了它。但这如何使任何约束失效?
  • 是的,这是一个悬而未决的问题。但是主键是该异常的唯一可能点,或者经度或纬度为空...
  • 谢谢 BC_ 我会试试你的建议。
  • 嗨 BC_,我删除了 AUTOINCREMENT,但仍然遇到同样的错误。我试过删除 id 和各种。你能想到我应该尝试的任何事情吗?我还将 lat 和 long 更改为 float 和 double ,这也没有奏效。
  • 您将字段更改为浮动和双倍???请尝试以下操作:ourDb.delete(DATABASE_TABLE, null, null);在插入之前添加这一行。(它只是为了测试:))
【解决方案2】:

替换:AUTO_INCREMENT 而不是 AUTOINCREMENT ^

【讨论】:

  • AUTO_INCREMENT 添加下划线
  • 为什么? AUTOINCREMENT 工作正常。 AUTO_INCREMENT 不在SQLite's keywords 中。支持AUTO_INCREMENT 的示例或文档在哪里?
  • 山姆:不,我没有任何触发器。
  • 感谢您的宝贵时间!!不,我不使用触发器。 Squonk,我会试试你的建议。
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多