Android SQLiteHelper无法创建FOREIGN KEY

时间:2014-03-17 11:31:36

标签: android sql sqlite

我在Android上遇到SQLite问题。我尝试以这种方式创建我的表:

贸易展览会:

String CREATE_TRADE_SHOW_TABLE = "CREATE TABLE tradeShows ( " +
                "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT NOT NULL, " +
                "location TEXT NOT NULL, " +
                "doDate DATE NOT NULL, " +
                "createdDate DATETIME NOT NULL, " +
                "lastModDate DATETIME NOT NULL, " +
                "pictureUrl TEXT, " +
                "picture BLOB )";
        db.execSQL(CREATE_TRADE_SHOW_TABLE);

它工作正常,然后,供应商:

String CREATE_TRADE_SHOW_TABLE = "CREATE TABLE vendors ( " +
                "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " +
                "tradeShowId INTEGER NOT NULL, " +
                "name TEXT NOT NULL, " +
                "createdDate DATETIME NOT NULL, " +
                "lastModDate DATETIME NOT NULL, " +
                "pictureUrl TEXT, " +
                "picture BLOB," +
                "FOREIGN KEY(tradeShowId) REFERENCES tradeShows(id)" +
                ")";
        db.execSQL(CREATE_TRADE_SHOW_TABLE);

所以现在创建了我的表供应商,但是tradeShowId FOREIGN KEY不存在。我没有得到任何错误,我的表创建得很好,但没有tradeShowId。

我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

SQLite支持外键,但默认情况下不支持。

如果您为API级别16或更高级别编写,则应该在SQLiteOpenHelper类的onConfigure方法中执行此操作:

@Override
public void onConfigure(SQLiteDatabase db) {
    db.setForeignKeyConstraintsEnabled(true);
}

在以前的API级别中,应该这样做:

@Override 
public void onOpen(SQLiteDatabase db) { 
    db.execSQL("PRAGMA foreign_keys = ON;"); 
}

您可以在SQLite documentation

中了解相关信息
  

“默认情况下禁用外键约束(对于向后   兼容性),因此必须为每个数据库单独启用它们   连接。 (但请注意,SQLite的未来版本可能会   更改以便默认启用外键约束[]。   细心的开发人员不会对是否进行任何假设   外键默认启用,但将启用或禁用   必要时。)“