2

緯度と経度の座標を 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();
}
4

2 に答える 2

2

キーワード AUTOINCREMENT を削除します。sqlite には必要ありません。null 値を主整数キーに挿入しようとすると、フィールドは自動的にその列の最大値より 1 大きい整数に変換されます。

さらに、エミュレーターで appdata をクリアする必要があります。その後、データベースが空であることを確認できます。

于 2012-08-25T15:28:53.750 に答える
0

置換: ^AUTO_INCREMENTの代わりにAUTOINCREMENT

于 2012-08-25T15:21:11.180 に答える