2014-01-27 45 views
10

中未生成FOREIGN KEY(...)約束當我創建如下所示的雙向1:n關係時,生成器不在表上使用任何FOREIGN KEY(...)約束。greenDAO在表

entity customer = schema.addEntity("Customer"); 
customer.addIdProperty(); 
customer.addStringProperty("name").notNull(); 

Entity order = schema.addEntity("Order"); 
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword 
order.addIdProperty(); 
Property orderDate = order.addDateProperty("date").getProperty(); 
Property customerId = order.addLongProperty("customerId").notNull().getProperty(); 
order.addToOne(customer, customerId); 

customer.addToMany(order, customerId); 

這是正常的嗎?它應該在表中生成FOREIGN KEY(...)約束還是僅在運行時通過代碼實施?

+0

我也有同樣的查詢。 – kierans

+0

你有沒有發現它? –

+0

不,我希望@greenrobot會迴應。 – Monstieur

回答

5

我在一個項目上工作時陷入了同樣的問題。

通過DaoGenerator生成的代碼,即使使用ToMany關係也不會生成外鍵約束。

我試着在每個實體DAO的查詢中手動追加外鍵約束,但它沒有解決問題。

引用sqlite文檔時,我發現外鍵不是默認實現的。對於爲數據庫創建的每個連接,必須運行查詢PRAGMA foreign_keys = ON;。我從adb shell驗證了它。運行PRAGMA查詢後,外鍵被強制執行。

最後一個問題是在項目中爲此代碼找到一個位置,以便它將在每個會話中執行。

解決辦法是在構造的端部由DaoGenerator項目

插入

if(!db.isReadOnly()){ 
    db.execSQL("PRAGMA foreign_keys = ON;"); 
} 

生成DaoSession類。

不要忘記在創建具有外鍵屬性的每個DAO的表查詢中手動添加外鍵約束。

0

order.addToOne(customer,customerId);

是正確的,它創建與客戶表的fk關係。但下一條語句

customer.addToMany(order,customerId);

是無效的,因爲沒有物業(稱爲客戶ID),如果你想創建被添加到客戶表

所以在這種情況下,許多關係到客戶表使用像

addToMany(在SourceProperty ,target,targetProperty)。但是,在我看來沒有必要customer.addToMany的(訂單,客戶ID)

-1

,你可以直接寫入XXXXDaocreateTable(){}

public static void createTable(Database db, boolean ifNotExists) { 
    String constraint = ifNotExists? "IF NOT EXISTS ": ""; 
    String sql = "CREATE TABLE " + constraint + "\"PERSONGROUPS\" (" + // 
       "\"_id\" INTEGER PRIMARY KEY ," + // 0: id 
       "\"PID\" TEXT," + // 1: pid 
       "\"GROUP_ID\" INTEGER," + 
       "FOREIGN KEY(\"PID\") REFERENCES PERSONS(\"PID\") ON DELETE CASCADE," + 
       "FOREIGN KEY(\"GROUP_ID\") REFERENCES GROUPS(\"_id\") ON DELETE CASCADE)"; 
    Log.v("PersonGroupDao", sql); 
    db.execSQL(sql); // 2: group_id 
} 

,你必須運行db.execSQL("PRAGMA foreign_keys = ON;");