【发布时间】: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”通知单个用户。我只是偶然发现了你的评论。