【问题标题】:SQLiteConstraintException: UNIQUE constraint failedSQLiteConstraintException:唯一约束失败
【发布时间】:2016-04-20 07:15:12
【问题描述】:

我查看了其他主题,但在代码中找不到我的错误。这是我创建数据库的代码

public class DBHelper extends SQLiteOpenHelper {

    //data base name
    private static final String DATABASE_NAME = "roomatesDB";

    //data base version
    private static final int DATABASE_VERSION = 1;

    //tables name
    public static final String APARTMENT_TABLE = "apartment";
    public static final String ROOMATE_TABLE = "roomate";
    public static final String SHOPCART_TABLE = "shopcart";
    public static final String ITEMS_TABLE = "items";

    //common column
    public static final String APARTMENT_NUMBER_COLUMN = "apartmentNum";

    //roomates table columns
    public static final String FIRST_NAME_COLUMN = "firstName";
    public static final String LAST_NAME_COLUMN = "lastName";
    public static final String PHONE_NUMBER_COLUMN = "phoneNumber";

    //shop cart table columns
    public static final String NUMBER_COLUMN = "number";
    public static final String LIST_NAME_COLUMN = "name";

    //item table
    public static final String PRICE_COLUMN = "price";
    public static final String ITEM_NAME_COLUMN = "name";

    //query for creating roomate table
    public static final String CREATE_ROOMATE_TABLE = "CREATE TABLE "
            + ROOMATE_TABLE + "(" + FIRST_NAME_COLUMN + " TEXT, "
            + LAST_NAME_COLUMN + " TEXT, " + PHONE_NUMBER_COLUMN + " TEXT, "
            + APARTMENT_NUMBER_COLUMN + " INTEGER, "
            + "FOREIGN KEY(" + APARTMENT_NUMBER_COLUMN + ") REFERENCES "
            + APARTMENT_TABLE + "(apartmentNum) " + ")";

    //query for crating shop cart table
    public static final String CREATE_SHOPLIST_TABLE = "CREATE TABLE "
            + SHOPCART_TABLE + "(" + NUMBER_COLUMN + " INTEGER PRIMARY KEY,"
            + LIST_NAME_COLUMN + " TEXT, "
            + APARTMENT_NUMBER_COLUMN + " INTEGER, "
            + "FOREIGN KEY(" + APARTMENT_NUMBER_COLUMN + ") REFERENCES "
            + APARTMENT_TABLE + "(apartmentNum) " + ")";

    //query for creating shop item table
    public static final String CREATE_SHOPITEM_TABLE = "CREATE TABLE "
            + ITEMS_TABLE + "(" + ITEM_NAME_COLUMN + " TEXT,"
            + PRICE_COLUMN + " DOUBLE, "
            + NUMBER_COLUMN + " INT, "
            + "FOREIGN KEY(" + NUMBER_COLUMN + ") REFERENCES "
            + SHOPCART_TABLE + "(number) " + ")";

    //query for creating apartment table
    public static final String CREATE_APARTMENT_TABLE = "CREATE TABLE "
            + APARTMENT_TABLE + "(" + APARTMENT_NUMBER_COLUMN + " INTEGER PRIMARY KEY"
            + ")";


    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_APARTMENT_TABLE);
        db.execSQL(CREATE_ROOMATE_TABLE);
        db.execSQL(CREATE_SHOPLIST_TABLE);
        db.execSQL(CREATE_SHOPITEM_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + APARTMENT_TABLE);
        db.execSQL("DROP TABLE IF EXISTS " + ROOMATE_TABLE);
        db.execSQL("DROP TABLE IF EXISTS " + SHOPCART_TABLE);
        db.execSQL("DROP TABLE IF EXISTS " + ITEMS_TABLE);

        onCreate(db);

    }

为了检查我是否尝试在活动上执行这些功能

public void createApartment() {
    SQLiteDatabase db = this.getWritableDatabase();



    ContentValues values = new ContentValues();
    values.put(APARTMENT_NUMBER_COLUMN, 1);
    // Inserting Row
    db.insert(APARTMENT_TABLE, null, values);
    db.close(); // Closing database connection
}

public void addRoomate(RoomateModel r) {
        SQLiteDatabase db = this.getWritableDatabase();

        int i = 1;

        ContentValues values = new ContentValues();
        values.put(FIRST_NAME_COLUMN, r.getName()); // Contact Name
        values.put(LAST_NAME_COLUMN, r.getLastName());
        values.put(PHONE_NUMBER_COLUMN, r.getPhoneNumber()); // Contact Phone Number
        values.put(APARTMENT_NUMBER_COLUMN, i);
        // Inserting Row
        db.insert(ROOMATE_TABLE, null, values);
        db.close(); // Closing database connection
    }

    public RoomateModel getRoomates() {
        RoomateModel r = null;
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT * FROM " + ROOMATE_TABLE + " WHERE 1";

        Cursor c = db.rawQuery(query, null);
        c.moveToFirst();
        while (!c.isAfterLast()) {
            String name = c.getString(0);
            String lastName = c.getString(1);
            String phoneNumber = c.getString(2);
            r = new RoomateModel(name, lastName, phoneNumber);
        }
        if (r == null) {
            r = new RoomateModel("bla", "bla", "bla");
        }

        return r;
    }

应用程序在加载活动之前崩溃 与主题中的错误 这是日志猫:

Error Code : 1555 (SQLITE_CONSTRAINT_PRIMARYKEY)
Caused By : Abort due to constraint violation.
(UNIQUE constraint failed: apartment.apartmentNum (code 1555))
#################################################################
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:952)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1609)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1479)
at atoa.roomates.SupportOperations.DBHelper.createApartment(DBHelper.java:106)
at atoa.roomates.QA.getRoomate(QA.java:49)
at atoa.roomates.QA.onCreate(QA.java:42)

【问题讨论】:

  • 很高兴你已经包含了代码,但是没有 logcat,很难确切知道问题发生在哪里
  • 你的 createApartment 方法在哪里?
  • 对不起,我也忘记了,我编辑了它,它现在在 AddRoomate 方法之前的代码上。谢谢
  • stackoverflow.com/a/45299979/6665568 。这个答案完全为我解决了这个问题。如果行已经存在,则处理您直接想要替换的情况。

标签: android database sqlite


【解决方案1】:

您的表上有一个主键,因此它必须是唯一值。

public static final String CREATE_APARTMENT_TABLE = "CREATE TABLE "
        + APARTMENT_TABLE + "(" + APARTMENT_NUMBER_COLUMN + " INTEGER PRIMARY KEY"
        + ")";

然而,您总是在该列中插入值 1。

values.put(APARTMENT_NUMBER_COLUMN, 1);
// Inserting Row
db.insert(APARTMENT_TABLE, null, values);

有几种方法可以解决这个问题,但您应该从使用不同的数字开始,而不是总是使用 1

【讨论】:

  • 我知道,但这只是我第一次尝试创建数据库。它用于检查
  • 如果您已经创建了数据库并一次又一次地运行应用程序,那么编号为 1 的公寓已经存在。这就是错误告诉你的内容
【解决方案2】:

我认为就像 cricket_007 说您正在尝试复制数据库中记录的 id,我不止一次使用过的快速解决方案是转到设置 -> 应用程序 -> 您的应用程序 -> 删除存储,然后应用程序将正常工作,但这不是一个好的解决方案,它只会通知您问题。这个问题的真正解决方案是确保 id 是唯一的,例如每次添加新记录时添加表的大小,或者如果用户可以使用许多帐户,则为每个用户名创建一个目录,尝试找出最适合您的情况。

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 2019-04-28
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多