领域 - 如果属性等于,请不要更新

时间:2015-09-30 23:38:22

标签: android realm

我正在使用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();

1 个答案:

答案 0 :(得分:0)

我认为基本上是一样的。
由于您担心性能,这里有一些可以改进的方法。

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 (int i = 0, j = openWorkOrders.size(); i < j; i++) {}之类的列表的for循环
    Streamlining Android Apps: Eliminating Code Overhead by Jake Wharton