GreenDAO не генерирует ограничение FOREIGN KEY (…) в таблице

Когда я создаю двунаправленную связь 1: n, как показано ниже, генератор не использует никаких ограничений FOREIGN KEY (…) в таблице.

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 (…) в таблице или это выполняется только во время выполнения через код?

Solutions Collecting From Web of "GreenDAO не генерирует ограничение FOREIGN KEY (…) в таблице"

Я занимался тем же вопросом, работая над проектом.

Происходя через сгенерированный код DaoGenerator, ограничения внешнего ключа не генерируются даже при использовании отношения ToMany.

Я попытался добавить ограничение внешнего ключа вручную в запросе в каждой сущности DAO, и все же это не решило проблему.

Обратившись к документации sqlite, я обнаружил, что внешний ключ не применяется по умолчанию. Вы должны запустить запрос PRAGMA foreign_keys = ON; Для каждого соединения, созданного в базе данных. Я проверил его из оболочки adb. Внешний ключ был введен после выполнения запроса PRAGMA.

Последняя проблема заключалась в том, чтобы найти место для этого кода в проекте, чтобы он выполнялся для каждого сеанса.

Решение находится в классе DaoSession, сгенерированном проектом DaoGenerator

вставить

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

В конце конструктора.

Не забудьте вручную добавить ограничение внешнего ключа в создании табличных запросов для каждого DAO, имеющего свойство внешнего ключа.

Order.addToOne (клиент, customerId);

Является правильным и создает отношения fk с таблицей клиентов. Но следующее утверждение

Customer.addToMany (заказ, customerId);

Недействительна, поскольку в таблицу клиента не добавлено свойство (customerId)

Поэтому в этом случае, если вы хотите создать отношение to-many к таблице клиентов, используйте

AddToMany (sourceProperty, target, targetProperty). Но, на мой взгляд, нет необходимости в customer.addToMany (order, customerId)

Вы можете напрямую написать createTable(){} в XXXXDao ,

 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;");