sqlite忽​​略我的外键约束

时间:2015-01-01 13:25:41

标签: android mysql database sqlite

我在android中创建了两个sqlite表

带有主键" id"

phone table

CREATE TABLE BLOCKED_PHONES_TABLE ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT 1, KEY_PHONE TEXT UNIQUE,KEY_IS_BLOCKED BIT )

comment table使用外键" id"

CREATE TABLE COMMENTS_TABLE ( id INTEGER, KEY_COMMENT_TEXT TEXT, FOREIGN KEY(id) REFERENCES BLOCKED_PHONES_TABLE(id))

代码:

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_BLOCKED_PHONES_TABLE =
            "CREATE TABLE "+ BLOCKED_PHONES_TABLE +
                    " ( "+ KEY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT 1, "
                    + KEY_PHONE + " TEXT UNIQUE,"
                    + KEY_IS_BLOCKED+" BIT )";

    db.execSQL(CREATE_BLOCKED_PHONES_TABLE);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // SQL statement to create book table

    String CREATE_COMMENTS_TABLE =
            "CREATE TABLE " + COMMENTS_TABLE +
                    " ( "+ KEY_ID+" INTEGER, "
                         + KEY_COMMENT_TEXT+" TEXT, "
                         + "FOREIGN KEY("+KEY_ID+") REFERENCES "+PhoneDal.BLOCKED_PHONES_TABLE+"("+KEY_ID+"))";

    db.execSQL(CREATE_COMMENTS_TABLE);

}

我添加了一些数据。

包括对同一部手机的2-3条评论。

enter image description here enter image description here

comment table为什么不将id作为外键?

否则它不会在phone表格中找不到ID。

我怎么知道我的sqlite版本?

enter image description here

修改 我补充说:

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("PRAGMA foreign_keys=ON;");
    phoneDal.onCreate(sqLiteDatabase);
    commentDal.onCreate(sqLiteDatabase);
}

1 个答案:

答案 0 :(得分:1)

首先,您需要检查您的SQLite版本,因为所有版本都不支持外键,如果您使用的是较新版本,则必须打开该功能,以便向后兼容此功能默认情况下已关闭,请仔细阅读以下链接,以便更好地了解如何操作。

http://www.sqlite.org/faq.html#q22
https://www.sqlite.org/foreignkeys.html

并启用它

       db.execSQL("PRAGMA foreign_keys=ON;");

希望这有助于.... :)