2012-04-23 22 views
11

Tôi có lớp này trừu tượng:Tạo bảng với Ngoại Collection Dòng

DomainItem

abstract public class DomainItem { 

    @DatabaseField(generatedId = true) 
    protected long id; 

    @ForeignCollectionField(eager = false) 
     protected ForeignCollection<ContentItem> contentItens; 

    //getters and setters 
} 

ContentItem:

abstract public class ContentItem { 

    @DatabaseField(generatedId = true) 
    protected long id; 

    @DatabaseField(foreign = true) 
    protected DomainItem domainItem; 


    @DatabaseField() 
    protected String content; 

    //getters and setters 
} 

Và những (không trừu tượng):

@DatabaseTable() 
public class PhytoterapicItem extends DomainItem{ 

    public PhytoterapicItem(){ 

    } 

} 

PhytoterapicContent

@DatabaseTable(tableName = "phytoterapiccontent") 
public class PhytoterapicContent extends ContentItem { 

    @DatabaseField(canBeNull = false) 
    private String defaultName; 

    @DatabaseField(canBeNull = false) 
    private String scientificName; 

    //getters and setters 
} 

Trong DatabaseHelper của tôi, tôi cố gắng tạo ra các bảng:

//DatabaseHelper 
... 
@Override 
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { 
    try { 
     Log.i(TAG, "onCreate"); 
     TableUtils.createTable(connectionSource, PhytoterapicContent.class); 
     Log.i(TAG, "Created table PhytoterapicContent"); 

     TableUtils.createTable(connectionSource, PhytoterapicItem.class); 
     Log.i(TAG, "Created table PhytoterapicItem"); 
    catch{ 
     ... 
    } 

Các PhytoterapicContent bảng được tạo ra. Nhưng tôi gặp lỗi sau:

java.sql.SQLException: Foreign collection class br.com.project.model.ContentItem for field 'contentItens' column-name does not contain a foreign field of class br.com.project.model.PhytoterapicItem

Trả lời

11

Vì vậy, thông báo ngoại lệ được thiết kế để trợ giúp tại đây. Để báo giá bằng tên lớp đã bị xóa:

Foreign collection class ContentItem for field contentItens column-name does not contain a foreign field of class PhytoterapicItem

Có vẻ như vậy. Bất cứ khi nào bạn có ForeignCollection, lớp học chứa trong bộ sưu tập phải có trường nước ngoài quay trở lại lớp cha.

Trong trường hợp của bạn, PhytoterapicItem mở rộng lớp DomainItem có một đối tượng ForeignCollection trong số ContentItem. Điều đó có nghĩa là ContentItem phải có trường nước ngoài thuộc loại PhytoterapicItem. Nếu không, làm cách nào để ORMLite biết mục nào trong số các mục ContentItem trong bảng được liên kết với một số PhytoterapicItem cụ thể.

Ví dụ về các đối tượng AccountOrder trong foreign collection documentation có thể giúp bạn với giản đồ của mình. Mỗi Account có bộ sưu tập nước ngoài là Order đối tượng. Bất cứ khi nào bạn truy vấn Account, truy vấn riêng biệt được thực hiện để tìm tập hợp các đối tượng Order tương ứng với một số Account cụ thể. Điều đó có nghĩa là mỗi Order phải có đối tượng Account ở nước ngoài.

+0

trình! Tôi rút ra các mối quan hệ của các lớp trừu tượng. Bây giờ họ đang ở trong mỗi 'mục' và tương ứng 'nội dung'. Cám ơn!!! – Munir

11

Tôi đã mất một thời gian để nhận thấy/hiểu khối này quan trọng từ các tài liệu (http://ormlite.com/docs/foreign-collection):

Remember that when you have a ForeignCollection field, the class in the collection must (in this example Order) must have a foreign field for the class that has the collection (in this example Account). If Account has a foreign collection of Orders, then Order must have an Account foreign field. It is required so ORMLite can find the orders that match a particular account.

Lý do tôi bị nhầm lẫn là vì tôi đã không tìm thấy bất kỳ mã ví dụ (trong tài liệu hoặc ví dụ dự án) trong đó "lớp chứa" tham chiếu lớp với bộ sưu tập. Nó được mô tả bằng lời nói, nhưng với bản chất của mối quan hệ - đối với một số mô tả tôi nghĩ có thể hơi khó khăn để làm theo khi nhìn thấy nó trong vài lần đầu tiên.

Như liệt kê ở trên trong câu hỏi ban (đó là cách cuối cùng tôi đã có ý tưởng để thử giải pháp tôi stumbled khi), khối ví dụ dưới đây có vẻ là cách chính xác để ánh xạ một-to- nhiều mối quan hệ bộ sưu tập trong OrmLite.

Ngoài ra, có một lưu ý về cách lớp bộ sưu tập cần phải được đặt vào lớp phần tử thu thập.


Dưới đây là các bước chính để chăm sóc:

A. Trong lớp có bộ sưu tập (DomainItem trong trường hợp này), chú thích lĩnh vực bộ sưu tập theo cách này:

@ForeignCollectionField(eager = true)

B. Trong lớp được chứa trong bộ sưu tập (ContentItem trong trường hợp này), bạn phải có một tài liệu tham khảo rõ ràng trở lại lớp cha mẹ có chứa bộ sưu tập:

@DatabaseField(foreign = true) protected DomainItem domainItem;

C. Trước khi kiên trì ContentItem, bạn phải lưu các DomainItem để ContentItem rằng để thiết lập chìa khóa nước ngoài quay lại DomainItem:

curContentItem.setDomainItem(curDomainItem); 

contentItemDao.create(curContentItem);` 

Tôi đã tìm ra điều này khi bộ sưu tập của tôi không được truy xuất ban đầu. Tôi đã xem bảng cho ContentItem và DomainItem_id chưa bao giờ được đặt ở đó.

VÍ DỤ:

public class DomainItem { 

    @DatabaseField(generatedId = true) 
    protected long id; 

    @ForeignCollectionField(eager = false) 
    protected ForeignCollection<ContentItem> contentItens; 

    // ... 
} 


public class ContentItem { 

    @DatabaseField(generatedId = true) 
    protected long id; 

    @DatabaseField(foreign = true) 
    protected DomainItem domainItem; 

    public void setDomainItem(DomainItem domainItem) { 

     this.domainItem = domainItem; 
    } 
} 
Các vấn đề liên quan