2013-04-09 2 views
5

Я довольно новичок в разработке Android в целом, и я даже не использовал greenDAO. Но, потратив много времени на мой класс генератора (где я моделирую свои сущности), я, наконец, смог создать что-то похожее на пример, приведенный в GitHub.Генератор greenDAO дает ошибку консоли, которая не имеет смысла

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 

Я действительно не уверен, что мне нужно беспокоиться, так как были созданы файлы. Но я не понимаю, почему упоминается отношение «один к одному», когда я использую отношение «ко многим», как это видно из моего кода. (В объекте чековой книжки может быть много объектов транзакций, и я намерен использовать каждое имя сущностей чековой книжки для привязки к нему транзакций.)

Нужно ли мне возвращаться и исправлять часть моего кода? Пожалуйста, спросите, нужно ли мне что-то разъяснить, и спасибо за ваше время!

+0

Вы правы, это довольно неясное сообщение. Спасибо вам за вопрос и ответ! – BeccaP

ответ

7

После просмотра файлов, созданных для меня 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); 

который решить мою проблему. У меня сложилось впечатление, что я могу использовать любой тип собственности для привязки транзакций к чековой книжке, поэтому я пытался использовать имя чековой книжки.

+3

Для этого требуется свойство Long. GreenDAO (и почти любой DAO для любой структуры) разрешает отношения 1: n, сохраняя идентификатор родительской строки в столбце в каждой дочерней строке. Это ваша собственная чековая книжка. 1: 1 работает аналогично, за исключением того, что идентификатор может быть помещен в одну или обе связанные таблицы для другой строки. Для работы с аналогичным свойством String требуется поддержка внешнего ключа, которая по умолчанию не включена в Android SQLite dbs. Вы можете использовать String в качестве внешнего ключа, но GreenDAO не имеет возможности автоматически разрешать эти отношения, и Android SQLite не будет применять его. –

0

кажется, что только GreenDao принимает тип Long как внешний ключ

Смежные вопросы