我对Android开发还是个新手,我甚至从来没有使用过greenDAO。但是在花了很多时间在我的生成器类(我在那里建模我的实体)上工作之后,我终于能够产生一些看起来类似于GitHub上给出的例子的东西。
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);
}
}
然后,我将代码作为java应用程序运行以生成DAO文件,就像greenDAO上的文档所说的那样。文件成功生成了,但是我在Eclipse的控制台中看到了这一行:
Warning to-one property type does not match target key type: ToMany 'Transactions' from Checkbook to Transaction
我真的不确定我是否需要担心,因为文件已经生成了。但我不明白的是,当我使用"对多"关系时,为什么会提到"对一"关系,正如在我的代码中所看到的那样。(在一个支票簿实体中可以有许多交易实体,我打算使用每个支票簿实体的名称将交易与它联系起来。)
我需要回去修复我的一部分代码吗?如果有什么需要我澄清的,请告诉我,谢谢你的时间!
查看了greenDAO为我生成的文件后,我找到了问题的解决方案。在我看来,addToMany()方法期望将一个Long属性传递给它,而我使用的是字符串属性。因此,我更改了生成器代码中的这两行:
Property cbName = transaction.addStringProperty("cb").notNull().getProperty();
ToMany cbToTrans = checkbook.addToMany(transaction, cbName);
:
Property checkbookId = transaction.addLongProperty("checkbookId").notNull().getProperty();
ToMany cbToTrans = checkbook.addToMany(transaction, checkbookId);
解决了我的问题。在我的印象中,我可以使用任何类型的属性将交易绑定到支票簿,所以我尝试使用支票簿名称。
似乎GreenDao只接受Long类型作为外键