【问题标题】:greenDAO generator gives console error that doesn't make sensegreenDAO 生成器给出了没有意义的控制台错误
【发布时间】:2016-03-15 22:40:38
【问题描述】:

总的来说,我对 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

由于文件已生成,我真的不确定是否需要担心。但我不明白的是,当我使用“对多”关系时,为什么会提到“一对一”关系,正如我的代码中所见。 (一个支票簿实体中可以有许多交易实体,我打算使用每个支票簿实体的名称来将交易与它联系起来。)

我是否需要返回并修复部分代码?请询问我是否需要澄清任何事情,感谢您的宝贵时间!

【问题讨论】:

  • 你说得对,这是一条非常晦涩的信息。谢谢你的问题和答案!

标签: android greendao


【解决方案1】:

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

这解决了我的问题。我的印象是我可以使用任何类型的属性将交易绑定到支票簿,所以我尝试使用支票簿名称。

【讨论】:

  • 它确实需要一个 Long 属性。 GreenDAO(以及几乎任何框架的任何 DAO)通过将父行的 ID 存储在每个子行的列中来解决 1:n 关系。那是您的 Property checkbookId。 1:1 的工作方式类似,只是 ID 可以放在另一行的一个或两个连接表中。使用 String 属性进行类似操作需要外键支持,Android SQLite dbs 中默认不启用外键支持。您可以使用 String 作为外键,但 GreenDAO 缺乏自动解析这些关系的能力,Android SQLite 不会强制执行。
【解决方案2】:

GreenDao 好像只接受 Long 作为外键

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2023-03-05
    • 2016-05-10
    相关资源
    最近更新 更多