2013-04-09 17 views
5

Ich bin ziemlich neu in Android-Entwicklung im Allgemeinen, und ich habe noch nie einmal greenDAO verwendet. Aber nachdem ich viel Zeit mit der Arbeit an meiner Generator-Klasse verbracht habe (wo ich meine Entitäten modelliere), konnte ich endlich etwas produzieren, das dem auf GitHub gegebenen Beispiel ähnlich sah.greenDAO Generator gibt Konsole Fehler, die keinen Sinn macht

import de.greenrobot.daogenerator.DaoGenerator; 
import de.greenrobot.daogenerator.Entity; 
import de.greenrobot.daogenerator.Property; 
import de.greenrobot.daogenerator.Schema; 
import de.greenrobot.daogenerator.ToMany; 


public class simbalDAOgen { 

public static void main(String[] args) throws Exception { 
    Schema schema = new Schema(1, "com.bkp.simbal"); //Schema(Int version, String package name) 
    addCBTrans(schema); //Add the entities to the schema 
    new DaoGenerator().generateAll(schema, "../Simbal/src-gen", "../Simbal/src-test"); //Generate DAO files 
} 

private static void addCBTrans(Schema schema){ 
    Entity checkbook = schema.addEntity("Checkbook"); 
    checkbook.addIdProperty(); 
    checkbook.addStringProperty("name").notNull(); 
    checkbook.addDateProperty("dateModified"); 
    checkbook.addStringProperty("balance"); // Use a string property because BigDecimal type should be used for currency 

    Entity transaction = schema.addEntity("Transaction"); 
    transaction.setTableName("TRANS"); // "TRANSACTION" is a reserved SQLite keyword 
    transaction.addIdProperty(); 
    transaction.addStringProperty("name"); 
    transaction.addStringProperty("category"); 
    Property transDate = transaction.addDateProperty("date").getProperty(); 
    transaction.addStringProperty("amount"); // Again use string for BigDecimal type 
    transaction.addStringProperty("notes"); 
    Property cbName = transaction.addStringProperty("cb").notNull().getProperty(); //What checkbook the transaction is in 

    ToMany cbToTrans = checkbook.addToMany(transaction, cbName); //Actually ties the transactions to their correct checkbooks 
    cbToTrans.setName("Transactions"); 
    cbToTrans.orderAsc(transDate); 
}  
} 

Ich lief dann den Code als Java-Anwendung meiner DAO-Dateien zu generieren, wie nur die Dokumentation auf greenDAO sagt. Die Dateien wurden erfolgreich generiert, jedoch habe ich diese Zeile in der Konsole in Eclipse:

Warning to-one property type does not match target key type: ToMany 'Transactions' from Checkbook to Transaction 

Ich bin wirklich nicht sicher, ob ich besorgt werden muß, da die Dateien generiert wurden. Aber was ich nicht verstehe ist, warum es eine "to-one" -Beziehung gibt, wenn ich eine "to-many" -Beziehung verwende, wie in meinem Code zu sehen ist. (Es kann viele Transaktionsentitäten in einer Scheckbuchsentität geben, und ich beabsichtige, den Namen jeder Scheckbuchsentität zu verwenden, um die Transaktionen mit ihr zu verknüpfen.)

Muss ich zurückgehen und einen Teil meines Codes reparieren? Bitte fragen Sie, wenn ich etwas klären muss, und danke für Ihre Zeit!

+0

Sie haben Recht, es ist eine ziemlich obskure Nachricht. Danke für die Frage und die Antwort! – BeccaP

Antwort

7

Nachdem ich mir die von greenDAO für mich generierten Dateien angesehen habe, habe ich die Lösung für mein Problem gefunden. Es scheint mir, dass die Methode addToMany() erwartet, dass eine Long-Eigenschaft an sie übergeben wird und ich eine String-Eigenschaft verwende. Also änderte ich diese beiden Zeilen in meinem Generator Code:

Property cbName = transaction.addStringProperty("cb").notNull().getProperty(); 

ToMany cbToTrans = checkbook.addToMany(transaction, cbName); 

dazu:

Property checkbookId = transaction.addLongProperty("checkbookId").notNull().getProperty(); 

ToMany cbToTrans = checkbook.addToMany(transaction, checkbookId); 

, die mein Problem gelöst. Ich hatte den Eindruck, dass ich jede Art von Eigenschaft verwenden könnte, um die Transaktionen mit dem Scheckbuch zu verknüpfen, also habe ich versucht, den Scheckbuchnamen zu verwenden.

+3

Es benötigt eine Long-Eigenschaft. GreenDAO (und so ziemlich jedes DAO für jedes Framework) löst 1: n-Beziehungen auf, indem die ID der übergeordneten Zeile in einer Spalte in jeder untergeordneten Zeile gespeichert wird. Das ist Ihre Eigenschaft checkbookId. 1: 1 funktioniert ähnlich, außer dass die ID in einer oder beiden verbundenen Tabellen für die andere Zeile platziert werden kann. Das gleiche Verhalten mit einer String-Eigenschaft erfordert die Unterstützung von Fremdschlüsseln, die in Android SQLite dbs standardmäßig nicht aktiviert ist. Sie können String als Fremdschlüssel verwenden, aber GreenDAO kann diese Beziehungen nicht automatisch auflösen und Android SQLite erzwingt das nicht. –

0

scheint es zu sein GreenDao akzeptiert nur Typ Long als Fremdschlüssel

Verwandte Themen