2016-07-21 13 views
0

Ich benutze Zucker ORM in meinem Android-App, und ich möchte wissen, wie man Beziehung zwischen Entitäten zu machen. Die Sache Ich mag würde zu mehr E-Mails und Telefonnummern (Arbeit, persönlich, zu Hause)Wie Beziehung zwischen zwei Entitäten machen - Zucker ORM

ich dies habe versucht zu haben:

ich es so hinzufügen können ..

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

aber wenn ich laden möchte, habe ich einen Fehler. Klasse kann nicht aus der Sqlite3-Datenbank gelesen werden.

Kontakt

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

Artikel

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

'Contact' hat keine Felder wie' id'. Versucht dies: 'Kontakt contact = SugarRecord.findById (Contact.class, 1);' mit Datensatz-Indizes beginnen bei Index 1. – vanloc

+0

Ich habe es versucht, es funktioniert auch nicht. java.lang.NullPointerException - "com.seznam_kontaktu.seznamkontaktu.Model.Contact.getName()" für eine Nullobjekt-Referenz " – Stepan

+0

Ich habe meine Frage aktualisiert. Überprüfen Sie bitte das. – vanloc

Antwort

1

Im Allgemeinen sollten Sie Contact vor Entdeckung oder aktualisieren diese initialisiert werden. Kann Contact haben Methode getName() ist null.

In diesem Fall ist Model.Contact.getName() ein Nullobjektverweis.

Also, sollten Sie meinen Code überprüfen:

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

ODER

Sie sollten mit Code versucht, alle Kontakte zu laden, dies wie findById erscheinen, aber es alle Zeilen in Contact erhalten:

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

Im Debugger Android S tudio, bitte alle Werte beachten. Kann in Ihren Daten falsch sein.

+0

Die Sache, die ich will, ist zu speichern (Name, Nummer, etc .....) in die Datenbank, rendern den Namen in Recycler anzeigen (diese beiden Dinge, die ich habe). Aber wenn ich auf ein Element in der Recycler-Ansicht klicke, öffnet sich ein Dialog mit einem Kontakt aus der Datenbank. Allerdings steckte ich gerade – Stepan

+0

Bist du sicher in der Datenbank Erfolg?'getName' ist null. Ich denke, das kann Problem, bitte überprüfen Sie in der Datenbank unter Felder 'name' ist null? Und meine aktualisierte Antwort sehen. – vanloc

+0

Ja, die Namen in der Recycler-Ansicht werden korrekt angezeigt. Also sollte es null sein – Stepan

0

Sie werden brauchen, was als eine Linkerklasse bekannt ist, da Sugar kein Konzept von eins zu eins oder von vielen zu vielen oder vielen Beziehungen hat (Listen und Objekte können nicht in Zucker gespeichert werden). Nur Strings, Ints etc:

public class ContactItem extends SugarRecord { 

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

     String content; 
     Integer type; 
     Contact contact; 

     } 

Wenn Sie zuerst die Objekte erstellen:

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

, wenn Sie von der DB erhalten sollten Sie alle Kontaktobjekte erhalten Sie brauchen, und holen es Objekte auf diese Weise:

Contact contact = Select.from(Contact.class).first(); 
ContactItem contactItem = Select.from(ContactItem.class).where("contact_linker_id").eq(contact.getId()); 
contact.addItem(contactItem);