2013-04-09 27 views
5

Tôi khá mới phát triển Android nói chung và thậm chí tôi chưa bao giờ sử dụng greenDAO. Nhưng sau khi dành nhiều thời gian làm việc cho lớp máy phát điện của tôi (nơi tôi lập mô hình thực thể của mình), cuối cùng tôi đã có thể tạo ra một cái gì đó trông giống như ví dụ được đưa ra trên GitHub.Trình tạo greenDAO cung cấp lỗi giao diện điều khiển không có ý nghĩa

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); 
}  
} 

Sau đó, tôi chạy mã dưới dạng ứng dụng java để tạo tệp DAO, giống như tài liệu trên greenDAO nói. Các tệp đã được tạo thành công, tuy nhiên tôi đã nhận được dòng này trong bảng điều khiển trong Eclipse:

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

Tôi thực sự không chắc liệu tôi có cần phải quan tâm vì các tệp đã được tạo hay không. Nhưng những gì tôi không hiểu là lý do tại sao có đề cập đến một mối quan hệ "một-một" khi tôi đang sử dụng một "to-nhiều" mối quan hệ, như có thể được nhìn thấy trong mã của tôi. (Có thể có nhiều thực thể giao dịch trong thực thể séc, và tôi dự định sử dụng tên của từng thực thể séc để buộc các giao dịch với nó.)

Tôi có cần quay lại và sửa một phần mã của mình không? Vui lòng hỏi xem tôi có cần làm rõ điều gì không và cảm ơn thời gian của bạn!

+0

Bạn nói đúng, đó là một thông điệp khá mơ hồ. Cảm ơn bạn cho cả câu hỏi và câu trả lời! – BeccaP

Trả lời

7

Sau khi xem các tệp được tạo bởi tôi bởi greenDAO, tôi đã tìm ra giải pháp cho vấn đề của mình. Dường như với tôi rằng phương thức addToMany() mong đợi một thuộc tính Long được truyền cho nó và tôi đã sử dụng một thuộc tính String. Vì vậy, tôi đã thay đổi hai dòng sau trong mã máy phát điện của tôi:

Property cbName = transaction.addStringProperty("cb").notNull().getProperty(); 

ToMany cbToTrans = checkbook.addToMany(transaction, cbName); 

này:

Property checkbookId = transaction.addLongProperty("checkbookId").notNull().getProperty(); 

ToMany cbToTrans = checkbook.addToMany(transaction, checkbookId); 

mà giải quyết vấn đề của tôi. Tôi đã được ấn tượng rằng tôi có thể sử dụng bất kỳ loại tài sản để buộc các giao dịch vào sổ séc, vì vậy tôi đã cố gắng sử dụng tên sổ séc.

+3

Nó cần một tài sản dài. GreenDAO (và khá nhiều DAO cho bất kỳ khung công tác nào) giải quyết mối quan hệ 1: n bằng cách lưu trữ ID của hàng cha trong một cột trong mỗi hàng con. Đó là sổ séc tài sản của bạnId. 1: 1 hoạt động tương tự, ngoại trừ việc ID có thể được đặt trong một trong hai hoặc cả hai bảng được kết nối cho hàng khác. Hoạt động tương tự với thuộc tính String yêu cầu hỗ trợ khóa ngoài, vốn không được bật theo mặc định trong các dbs SQLite của Android. Bạn có thể sử dụng String làm khóa ngoại, nhưng GreenDAO thiếu khả năng tự động giải quyết các mối quan hệ này và Android SQLite sẽ không thực thi nó. –

0

có vẻ như GreenDao chỉ chấp nhận loại Dài là khóa ngoài

Các vấn đề liên quan