【问题标题】:common code practice to perform database operations in realm在领域中执行数据库操作的常见代码实践
【发布时间】:2016-11-19 15:35:45
【问题描述】:

这更像是一个设计模式问题而不是 realm ,我正在尝试将两种不同类型的对象添加到领域中。

complaint 
dealer

我创建了两个单独的函数来添加这两个对象。我的问题是我不想为每个对象编写单独的代码来将数据插入领域,我想通过定义一个通用类然后扩展该类来进行概括。

这是我当前的代码

经销商

public void insertDealersData(final Dealers 经销商){

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

投诉 public void insertComplaintData(最终投诉投诉){

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

如您所见,除了对象类型外,代码没有任何变化。所以任何人都可以建议我如何通过减少冗余来概括代码。

投诉模式

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

经销商模式

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

【问题讨论】:

  • 流程看起来很相似,但您调用的方法不同:getDealersList()getComplaintsList(),因此它不仅仅是“对象类型”。如果你只有两种不同的类型,我可能会忍受代码重复,因为任何概括的尝试都会使代码更长+更不可读。
  • 如果你分享ComplaintDealer的模型类,那么我会回答这个问题
  • @EpicPandaForce 我用模型更新了我的问题
  • @EpicPandaForce 你能提出任何其他我打算删除这个问题的建议吗,因为我喜欢问它没有相关性
  • 啊,是的,对不起,我工作太忙了,然后我忘记了这个。等一下

标签: android design-patterns realm


【解决方案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;
    }
}

【讨论】:

  • +1 感谢您的时间和投入,我很感激。但是我试图了解你是如何得出这个解决方案的 :) 似乎它融合了 java 泛型和设计模式。需要一点时间来掌握它:) 如果可能的话,我真的很想学习所有这些,那么你能分享一下获得这种技能的路线图吗?我也在你的博客上阅读了很多文章,发现信息量很大,可以有效地设计领域方案。
  • @Hunt 没有太多的设计模式,我只是将需要在两个类之间共享的所有“过于具体”的东西撕掉到它们自己的接口中,否则我只是转身基于此,整个事情变成了一个模板方法public void &lt;T extends ...&gt; blah。当我第一次将 this monster 放在后端代码中时,我就获得了这些技能。
  • 连同this question / answer。之后就很容易写出this one这样的答案了
  • ThtsGrt !感谢您的所有帮助,我将尝试根据您的参考创建一些示例。如果你不介意的话,有任何直接的媒介可以通过聊天/电子邮件联系你吗?
  • 我的名字在几乎所有其他平台上都是 Zhuinden,我总是在 Skype 上,除非我在开​​会或有什么奇怪的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2020-08-18
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多