2014-01-27 7 views
10

Wenn ich eine bidirektionale 1: n-Beziehung wie unten gezeigt erstelle, verwendet der Generator keine FOREIGN KEY (...) - Einschränkungen für die Tabelle.greenDAO generiert keine FOREIGN KEY-Einschränkung (...) in der Tabelle

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

Ist das normal? Soll es FOREIGN KEY (...) in der Tabelle erzeugen oder wird es nur zur Laufzeit durch Code erzwungen?

+0

auch ich habe das gleiche Abfrage. – kierans

+0

Haben Sie davon erfahren? –

+0

Nein. Ich wünschte @ greenrobot würde antworten. – Monstieur

Antwort

5

Ich war bei dem gleichen Problem während der Arbeit an einem Projekt fest.

Durch den generierten Code von DaoGenerator werden Fremdschlüsselbeschränkungen auch bei Verwendung der ToMany-Beziehung nicht generiert.

Ich versuchte, die Fremdschlüsseleinschränkung in der Abfrage in jeder Entitäts-DAO manuell anzuhängen, und dennoch wurde das Problem nicht gelöst.

Mit Bezug auf die SQLite-Dokumentation habe ich festgestellt, dass der Fremdschlüssel standardmäßig nicht erzwungen wird. Sie müssen die Abfrage PRAGMA foreign_keys = ON; für jede Verbindung ausführen, die für die Datenbank erstellt wurde. Ich habe es von adb Shell verifiziert. Der Fremdschlüssel wurde nach dem Ausführen der PRAGMA-Abfrage erzwungen.

Letztes Problem war, einen Platz für diesen Code im Projekt zu finden, so dass er für jede Sitzung ausgeführt wird.

Lösung wird in DaoSession Klasse durch das DaoGenerator Projekt erzeugt

Insert

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

am Ende des Konstruktors.

Vergessen Sie nicht, die Bedingung für Fremdschlüssel manuell in create table-Abfragen für jedes DAO mit Fremdschlüsseleigenschaft hinzuzufügen.

0

order.addToOne (Kunde, KundeId);

ist korrekt und es erstellt fk Beziehung mit Kundentabelle. aber die nächste Anweisung

customer.addToMany (order, customerId);

ist nicht gültig, weil es keine Eigenschaft ist (so genannte customerId) an den Kunden Tabelle hinzugefügt wird

so in diesem Fall, wenn Sie zu viele Bezug auf Kundentabelle verwenden wie

addToMany (Quell-erstellen möchten , target, targetProperty). Aber meiner Meinung nach gibt es keine Notwendigkeit von customer.addToMany (Auftrag, customerId)

-1

Sie direkt an createTable(){} in XXXXDao schreiben kann,

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 
} 

und Sie db.execSQL("PRAGMA foreign_keys = ON;"); laufen müssen

Verwandte Themen