2016-11-17 5 views
0

Dies ist eher eine Design-Muster Frage als realm, ich versuche, zwei verschiedene Arten von Objekten in Realm hinzuzufügen.Common Code-Praxis zur Durchführung von Datenbankoperationen in Realm

complaint 
dealer 

Ich habe eine zwei separate Funktion erstellt, um diese zwei Objekte hinzuzufügen. Mein Problem ist, dass ich keinen separaten Code für das Einfügen von Daten in den Realm für jedes Objekt schreiben möchte. Ich möchte verallgemeinern, indem ich eine gemeinsame Klasse definiere und dann diese Klasse erweitere.

hier ist mein aktueller Code

für Händler

public void insertDealersData (endgültige Händler Händler) {

final Realm realm = getExplicitRealm() ; 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 

      int newDealersSize = dealers.getDealersLists().size(); 
      Dealers dbDealers= realm.where(Dealers.class).findFirst(); 

      if(dbDealers!=null){ 
       for(int i =0;i<newDealersSize;i++){ 
        DealersList temp= realm.where(DealersList.class).equalTo("dealerid", 
          dealers.getDealersLists().get(i).getDealerid()).findFirst(); 
        if(temp!=null){ 
         dbDealers.getDealersLists().set(i,temp); 
        }else{ 
         dbDealers.getDealersLists().add(dealers.getDealersLists().get(i)); 
        } 
       } 
      }else{ 
       realm.copyToRealmOrUpdate(dealers); 
       Log.i(TAG, "insertDealersData : dump"); 
      } 
     } 
    },new Realm.Transaction.Callback(){ 

     @Override 
     public void onSuccess() { 
      realm.close(); 
     } 
     @Override 
     public void onError(Exception e) { 
      realm.close();  
     } 
    }); 
} 

zur Beanstandung public void insertComplaintData (endgültige Beschwerde Beschwerde) {

final Realm realm = getExplicitRealm() ; 

    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 

      int newComplaintSize = complaint.getComplaintLists().size(); 
      Complaint dbComplaint= realm.where(Complaint.class).findFirst(); 

      if(dbComplaint!=null){ 
       for(int i =0;i<newComplaintSize;i++){ 
        ComplaintList temp= realm.where(ComplaintList.class).equalTo("incidentid", 
          complaint.getComplaintLists().get(i).getIncidentid()).findFirst(); 
        if(temp!=null){ 
         dbComplaint.getComplaintLists().set(i,temp); 
         Log.i(TAG, "insertComplaintData : update existing"); 
        }else{ 
         dbComplaint.getComplaintLists().add(complaint.getComplaintLists().get(i)); 
         Log.i(TAG, "insertComplaintData : add new "); 
        } 
       } 

      }else{ 
       realm.copyToRealmOrUpdate(complaint); 
       Log.i(TAG, "insertComplaintData : dump"); 
      } 
     } 
    },new Realm.Transaction.Callback(){ 
     @Override 
     public void onSuccess() { 
      realm.close(); 
     } 
     @Override 
     public void onError(Exception e) { 
      realm.close(); 
     } 
    }); 
} 

Wie Sie sehen können, gibt es keine Änderung in einem Code außer dem Objekttyp. also kann jemand vorschlagen, wie ich einen Code verallgemeinern kann, indem er die Redundanz verringert.

Beschwerde Modell

public class Complaint extends RealmObject{ 

    private String status;  
    private String errorMessage;  
    private String count; 
    @PrimaryKey  
    private String userId;  
    private String organizationId; 
    @JsonField(name ="complaints" , typeConverter = ComplaintListConverter.class) 
    private RealmList<ComplaintList> complaintLists;  

} 
@JsonObject 
public class ComplaintList extends RealmObject implements ComplaintInterface { 

    @PrimaryKey 
    private String _id;  
    private String incidentid;  
    private String title;  
    private String casetypecode; 
    private String customerid; 
} 

Händler Modell

public class Dealers extends RealmObject { 
    private String status; 
    private String errorMessage; 
    private String count; 
    @PrimaryKey 
    private String userId; 
    private String organizationId; 
    @JsonField(name="dealers", typeConverter = DealersListConverter.class) 
    private RealmList<DealersList> dealersLists; 
} 


public class DealersList extends RealmObject { 


    @PrimaryKey 
    private String _id; 
    private String dealerid; 
    private String accountnumber; 
    private String name; 
    private String alletec_type; 
    private String telephone1; 

} 
+0

Der Fluss sieht ähnlich aus, aber sie verschiedene Methoden aufrufen: 'getDealersList()' 'vs. getComplaintsList() ', so ist es mehr als nur der" Objekttyp ". Wenn Sie nur zwei verschiedene Typen haben, würde ich wahrscheinlich mit der Code-Duplizierung leben, da jeder Versuch, ihn zu verallgemeinern, den Code länger und unlesbarer machen würde. –

+0

Wenn Sie die Modellklasse für "Beschwerde" und "Dealer" teilen, werde ich diese Frage beantworten – EpicPandaForce

+0

@EpicPandaForce Ich habe meine Frage mit den Modellen – Hunt

Antwort

1
public interface Insertable<L extends RealmObject & InsertableList> { 
    Class<L> getListClass(); 
    List<L> getList(); 
    String getListIdField(); 
} 

public interface InsertableList { 
    String getId(); 
} 

public <T extends RealmObject & Insertable<L>, L extends RealmObject & InsertableList> void insertData(final T insertable) { 
    final Realm realm = getExplicitRealm(); 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      int newListSize = insertable.getList().size(); 
      T dbInsertable = realm.where((Class<T>)insertable.getClass()).findFirst(); 

      if(dbInsertable != null) { 
       for(int i = 0; i < newListSize; i++) { 
        L temp = realm.where(insertable.getListClass()) 
          .equalTo(insertable.getListIdField(), insertable.getList().get(i).getId()) 
          .findFirst(); 
        if(temp != null) { 
         dbInsertable.getList().set(i, temp); 
        } else { 
         dbInsertable.getList().add(insertable.getList().get(i)); 
        } 
       } 
      } else { 
       realm.copyToRealmOrUpdate(insertable); 
       Log.i(TAG, "insertDealersData : dump"); 
      } 
     } 
    }, new Realm.Transaction.Callback(){ 
     @Override 
     public void onSuccess() { 
      realm.close(); 
     } 
     @Override 
     public void onError(Exception e) { 
      realm.close(); 
     } 
    }); 
} 

public class Dealers extends RealmObject implements Insertable<DealersList> { 
    private String status; 
    private String errorMessage; 
    private String count; 
    @PrimaryKey 
    private String userId; 
    private String organizationId; 
    @JsonField(name="dealers", typeConverter = DealersListConverter.class) 
    private RealmList<DealersList> dealersLists; 

    @Override 
    public Class<DealersList> getListClass() { 
     return DealersList.class; 
    } 

    @Override 
    public List<DealersList> getList() { 
     return dealersLists; 
    } 

    @Override 
    public String getListIdField() { 
     return "_id"; 
    } 
} 


public class DealersList extends RealmObject implements InsertableList { 


    @PrimaryKey 
    private String _id; 
    private String dealerid; 
    private String accountnumber; 
    private String name; 
    private String alletec_type; 
    private String telephone1; 

    @Override 
    public String getId() { 
     return _id; 
    } 
} 
+0

+1 Dank für Ihre Zeit und Eingabe, ich schätze das. Aber ich versuche zu lernen, wie genau Sie diese Lösung abgeleitet haben :) scheint es eine Mischung aus Java-Generika und Design-Muster. brauche ein wenig Zeit, um es zu begreifen :) Ich möchte genau das alles lernen, wenn möglich, dann kannst du die Straßenkarte teilen, um diese Art von Fähigkeiten zu erwerben. Ich habe auch viele Artikel in Ihrem Blog gelesen und finde ein ziemlich informatives Design-Realm-Schema. – Hunt

+0

@Hunt gibt es nicht viel Design-Muster, ich habe nur alle Dinge "zu spezifisch", die ich zwischen den beiden Klassen in ihre eigene Schnittstelle teilen musste zerrissen, und sonst habe ich nur das Ganze in eine Vorlage-Methode 'öffentliche Leere blah' basierend darauf. Ich habe diese Fähigkeiten erworben, als ich das erste [** Monster] zusammengestellt habe (https://github.com/Zhuinden/SpringBootDemoRestService/blob/master/DemoRestService/src/main/java/springpetserver/rest/methods/DefaultControllerMethods.java) ** im Backend-Code. – EpicPandaForce

+0

Zusammen mit [dieser Frage/Antwort] (http://stackoverflow.com/questions/28234960/java-generics-and-enum-loss-of-template-parameters). Danach war es ziemlich einfach, Antworten zu schreiben wie [diese] (http://stackoverflow.com/questions/30616864/how-to-make-type-safety-with-generics) – EpicPandaForce

Verwandte Themen