2013-04-09 3 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); 
}  
} 

그런 다음 greenDAO의 문서에서와 같이 Java 응용 프로그램으로 코드를 실행하여 DAO 파일을 생성했습니다.

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

내가 정말 파일이 생성 된 이후 우려 할 필요가 있는지 확실하지 않습니다 : 파일이 성공적으로 생성 된, 그러나 나는 이클립스 콘솔에서이 줄을 얻었다. 그러나 내가 이해할 수없는 것은 필자의 코드에서 볼 수있는 것처럼 "to-many"관계를 사용할 때 "to-one"관계에 대한 언급이있는 이유이다. (수표 책 엔티티에는 많은 거래 엔티티가있을 수 있으며 각 수표 엔티티의 이름을 사용하여 트랜잭션을 연결하려고합니다.)

코드로 되돌아 가야합니까? 내가 무엇인가를 명확히해야하는지 물어보고, 시간 내 주셔서 감사합니다!

+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)는 모든 자식 행의 열에 부모 행의 ID를 저장하여 1 : n 관계를 해결합니다. 그것이 귀하의 재산 수표 책입니다. 1 : 1은 ID가 다른 행에 대해 연결된 테이블 중 하나 또는 둘 모두에 배치 될 수 있다는 점을 제외하고는 유사하게 작동합니다. String 속성과 유사하게 작동하려면 외래 키 지원이 필요합니다.이 외래 키 지원은 Android SQLite dbs에서 기본적으로 활성화되어 있지 않습니다. String을 외래 키로 사용할 수 있지만 GreenDAO는 이러한 관계를 자동으로 해결할 능력이 없으며 Android SQLite가이를 적용하지 않습니다. –

0

GreenDao는 외래 키로 Long 유형 만 허용합니다.