2016-07-21 1 views
0

私は私のAndroidアプリにシュガーORMを使用して、私はエンティティ間の関係を作る方法を知っていただきたいと思います。私がしたい事は(仕事、個人、家庭を)より電子メールや電話番号を持つことである作るどのように2つのエンティティ間の関係 - シュガーORM

私はこれを試してみました:

私はこのようにそれを追加することができます。..

Contact contact = new Contact(); 
ContactItem contactItem = new ContactItem(); 
contactItem.setType(1); 
contact.getItems.add(contactItem); 

が、私がロードしたいとき、私はエラーがあります。 クラスはSqlite3データベースから読み取ることができません。

問い合わせ

public class Contact extends SugarRecord { 

    private String name; 
    private String phoneNumber; 
    private String email; 
    private boolean favourite; 
    private String imagePath; 
    @Ignore private boolean visibleFirstLetter; 

    public List<ContactItem> items; 

    public Contact() { 
     //empty constructor 
    } 

    public Contact(String name, String number, String email, boolean favourite, String imagePath) { 
     this.name = name; 
     this.phoneNumber = number; 
     this.email = email; 
     this.favourite = favourite; 
     this.imagePath = imagePath; 
     this.items = new ArrayList<>(); 
    } 

    public void setName(String name) {this.name = name; } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public void setPhoneNumber(String phoneNumber) { 
     this.phoneNumber = phoneNumber; 
    } 

    public void setFavourite(Boolean favourite) { 
     this.favourite = favourite; 
    } 

    public void setVisibleFirstLetter(Boolean visibleFirstLetter) { 
     this.visibleFirstLetter = visibleFirstLetter; 
    } 
    public String getName() { 
     return name; 
    } 

    public String getEmail() { return email; } 

    public String getPhoneNumber() { 
     return phoneNumber; 
    } 

    public boolean isFavourite() { return favourite; } 

    public boolean isVisibleFirstLetter() { 
     return visibleFirstLetter; 
    } 

    public String getImagePath() { return imagePath; } 

    public void setImagePath(String imagePath) { this.imagePath = imagePath; } 

    public List<ContactItem> getItems() { 
     return items; 
    } 
} 

アイテム一般

public class ContactItem { 

    String content; 
    Integer type; 
    Contact contact; 


    public static final Integer HOME = 0; 
    public static final Integer WORK = 1; 
    public static final Integer EMAIL = 2; 
    public static final Integer FAX = 3; 

    public ContactItem() { 
     //empty constructor 
    } 
    public ContactItem(Integer type, String content) { 
     this.type = type; 
     this.content = content; 
    } 

    public void setType(Integer type) { 
     this.type = type; 
    } 

    public void setContent(String content) { 
     this.content = content; 
    } 

    public String getContent() { return content; } 

    public Integer getType() { return type; } 

    public Contact getContact() { return contact; } 

    public void setContact(Contact contact) { this.contact = contact; } 
} 
+0

'連絡先'には 'id'のようなフィールドはありません。これを試みました: 'Contact contact = SugarRecord.findById(Contact.class、1);'レコードインデックスはインデックス1から始まります。 – vanloc

+0

私はそれを試しましたが、それも動作していません。 java.lang.NullPointerException - ヌルオブジェクト参照の "com.seznam_kontaktu.seznamkontaktu.Model.Contact.getName() ' – Stepan

+0

私の質問が更新されました。これをチェックしてください。 – vanloc

答えて

1

、あなたはこれを見つけたり、更新前Contact初期化する必要があります。 Contactがあります。getName()がnullです。

この場合、Model.Contact.getName()はnullオブジェクト参照です。

Contact contact = new Contact("Stepan", "09293293", [email protected], true); 
contact.save(); 
Contact contact = SugarRecord.findById(Contact.class, (long) 1); 

OR

あなたはすべての連絡先をロードするためのコードをしようとしたはずですが、これはfindByIdのように思えるが、それはContact内のすべての行を取得:

だから、あなたは私のコードをチェックする必要があります

List<Contact> contacts = SugarRecord.listAll(Contact.class);

デバッガでは、Android S tudio、すべての値を見てください。あなたのデータに誤りがある可能性があります。

+0

私が望むのは、データベースに(名前、番号など)を保存し、リサイクラビューで名前をレンダリングすることです(これらの2つのことがあります)。しかし、リサイクラービューで項目をクリックすると、データベースからの連絡先とのダイアログが開きます。しかし、私は今すぐ立ち往生しました – Stepan

+0

あなたはデータベースの成功に保存していますか?'getName'はnullです。私はこれが問題だと思う、 'name'がnullのフィールドでデータベースをチェックしてください? 更新された回答を参照してください。 – vanloc

+0

ええ、リサイクラビューの名前が正しく表示されています。したがって、nullにする必要があります – Stepan

0

Sugarには、1対1または多対多の多対多の関係(リストとオブジェクトは砂糖に格納することはできません)の概念がないため、リンカクラスとして知られているものが必要になります。文字列、int型などのみ:

public class ContactItem extends SugarRecord { 

     @Column(name = "contact_linker_id", unique = true) 
     @Expose 
     private int mContactId; 

     String content; 
     Integer type; 
     Contact contact; 

     } 

あなたは最初のオブジェクトを作成する場合:

Contact contact = new Contact(); 
contact.getId() //or other unique identifier 
ContactItem contactItem = new ContactItem(); 
contactItem.mContactId = contact.getId(); 
contactItem.save(); 
contact.save(); 

あなたがDBから取得するとき、あなたは、すべての連絡先は、あなたが必要とし、それがこのようオブジェクトだフェッチするオブジェクトを取得する必要があります

Contact contact = Select.from(Contact.class).first(); 
ContactItem contactItem = Select.from(ContactItem.class).where("contact_linker_id").eq(contact.getId()); 
contact.addItem(contactItem); 
関連する問題