领域 - 如果 属性 等于则不更新

Realm - Do not update if property equals

我正在为 Android 使用领域。我有以下代码并且可以正常工作,但我想知道这是否是更新对象的最佳方式,以及它是否会导致任何性能问题。

目前,如果状态设置为正在处理,我不想更新现有对象。

List<WorkOrderObject> woList = new ArrayList<>();
            for (int i = 0; i < openWorkOrders.size(); i++) {
                if (!visnetawrap.isUserLoggedIn) {
                    return;
                }
                WorkOrderObject wo = visnetawrap.gsonClient.fromJson(openWorkOrders.get(i).toString(), WorkOrderObject.class);

                WorkOrderObject currWO = realmThread.where(WorkOrderObject.class).equalTo("id", wo.getOrderRawId()).findFirst();
                if (currWO != null) {
                    if (currWO.getOrderStatus().equals("Processing")) {
                        continue;
                    }
                }

                issueDateTime = AppUtils.formatTimestampToDateTime(wo.getOrderIssueDate());
                issueDateString = issueDateTime.toLocalDateTime().toString("MM/dd/yyyy", Locale.US);
                dueDateTime = AppUtils.formatTimestampToDateTime(wo.getOrderDueDate());
                dueDateString = dueDateTime.toLocalDateTime().toString("MM/dd/yyyy", Locale.US);

                if (!issueDateString.equals("") && !issueDateString.equals("00/00/0000") && issueDateTime.getYear() >= now.getYear() && !dueDateString.equals("") && !dueDateString.equals("00/00/0000") && dueDateTime.getYear() >= now.getYear()) {
                    //Log.d("dueDate", dueDateString);
                    woList.add(wo);
                }
            }
            realmThread.beginTransaction();
            realmThread.copyToRealmOrUpdate(woList);
            realmThread.commitTransaction();

我觉得基本上是一样的
由于您担心性能,因此您可以通过以下方式进行改进。

private static String PROCESSING = "Processing";
private static String DATE_FORMAT = "MM/dd/yyyy";
private static String EMPTY_DATE = "00/00/0000";

public void betterMethod() {
    List<WorkOrderObject> woList = new ArrayList<>(openWorkOrders.size());

    //I think this code doesnot need to be inside loop.
    if (!visnetawrap.isUserLoggedIn) {
        return;
    }
    for (int i = 0, j = openWorkOrders.size(); i < j; i++) {
        //Since you are using gson there are ways to convert JsonArray to list directly which is a better way than this
        WorkOrderObject wo = visnetawrap.gsonClient.fromJson(openWorkOrders.get(i).toString(), WorkOrderObject.class);

        WorkOrderObject currWO = realmThread.where(WorkOrderObject.class).equalTo("id", wo.getOrderRawId()).findFirst();

        if (currWO != null && currWO.getOrderStatus().equals(PROCESSING)) { //Its cleanar way
            continue;
        }

        issueDateTime = AppUtils.formatTimestampToDateTime(wo.getOrderIssueDate());
        issueDateString = issueDateTime.toLocalDateTime().toString(DATE_FORMAT, Locale.US);
        dueDateTime = AppUtils.formatTimestampToDateTime(wo.getOrderDueDate());
        dueDateString = dueDateTime.toLocalDateTime().toString(DATE_FORMAT, Locale.US);

        //I assume you have stripped out code where it needs string
        //You can use TextUtils.isEmpty() or issueDateString.isEmpty() , 
        // issueDateString.equals("") does is creates new String which is empty and compares issueDateString with it while above methods just check the 
        //length of string
        if (!TextUtils.isEmpty(issueDateString) && !issueDateString.equals(EMPTY_DATE) && issueDateTime.getYear() >= now.getYear() && !TextUtils.isEmpty(dueDateString) && !dueDateString.equals(EMPTY_DATE) && dueDateTime.getYear() >= now.getYear()) {
            //Log.d("dueDate", dueDateString);
            woList.add(wo);
        }
    }
    if (!woList.isEmpty()) {
        realmThread.beginTransaction();
        realmThread.copyToRealmOrUpdate(woList);
        realmThread.commitTransaction();
    }
}
  1. For 循环可能非常大,因此像 currWO.getOrderStatus().equals("Processing") 这样的条件语句将创建一个新字符串并进行比较。最好在之前初始化字符串,如上传递。
  2. Converting JsonArray to List

  3. 为什么像 new ArrayList<>(openWorkOrders.size()) 这样实例化数组并使用 for 循环和 for (int i = 0, j = openWorkOrders.size(); i < j; i++) {}
    这样的列表 Streamlining Android Apps: Eliminating Code Overhead by Jake Wharton