Android greenDAO generator给出的控制台错误不';没有道理

Android greenDAO generator给出的控制台错误不';没有道理,android,greendao,Android,Greendao,一般来说,我对安卓系统的开发相当陌生,而且我从来没有使用过绿道。但是,在花了大量时间研究generator类(我在其中对实体进行建模)之后,我终于能够生成与GitHub上给出的示例类似的东西 import de.greenrobot.daogenerator.DaoGenerator; import de.greenrobot.daogenerator.Entity; import de.greenrobot.daogenerator.Property; import de.greenrobot

一般来说,我对安卓系统的开发相当陌生,而且我从来没有使用过绿道。但是,在花了大量时间研究generator类(我在其中对实体进行建模)之后,我终于能够生成与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属性,而我使用的是String属性。所以我在生成器代码中更改了这两行:

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只接受类型,只要外键

它确实需要一个长属性。GreenDAO(对于任何框架,几乎所有DAO)都通过在每个子行的列中存储父行的ID来解析1:n关系。这是你的财产支票簿ID。1:1的工作原理类似,只是可以将ID放置在另一行的任一个或两个连接表中。使用字符串属性进行类似操作需要外键支持,这在Android SQLite dbs中默认情况下是不启用的。您可以使用字符串作为外键,但GreenDAO缺乏自动解决这些关系的能力,Android SQLite不会强制执行。您是对的,这是一条非常模糊的消息。谢谢你的提问和回答!