ORMLite работает слишком медленно при загрузке

У меня есть 1500+ предметов этого класса, хранящихся в базе данных:

public class Task implements Parcelable{

    @DatabaseField(dataType = DataType.LONG, id = true)
    private long ActionId;
    @DatabaseField(dataType = DataType.STRING)
    private String Text;
    @DatabaseField(dataType = DataType.STRING)
    private String actionText;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isUrgent;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isImportant;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isCompleted;
    @DatabaseField(dataType = DataType.STRING)
    private String description;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isDeleted;
    @DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = true, index = true)
    private Role role;
    @DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = true, index = true)
    private List list;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isWeekly;
    @DatabaseField(dataType = DataType.STRING)
    private String Date;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    Long ActionListId;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long createdAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long updatedAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long deletedAt;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isNew;  
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long roleId;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long WorkspaceId;
    @DatabaseField(dataType = DataType.INTEGER)
    private int order;
    @DatabaseField(dataType = DataType.STRING)
    private String WeekDate;
    @Override
    public boolean equals(Object o) {
        if(o instanceof Task) {
             Task task = (Task)o;
             if(task.getActionId() == this.getActionId())
                  return true;
             return false;
        } else return false;
    }

    @Override
    public String toString() {
        return "Name : " + Text;
    }
}

И это код для этих двух иностранных классов:

public class Role implements Parcelable{

    @DatabaseField(dataType = DataType.LONG, id = true)
    long id;
    @DatabaseField(dataType = DataType.STRING)
    String date;
    @DatabaseField(dataType = DataType.STRING)
    String Text;
    @DatabaseField(dataType = DataType.STRING)
    String Color;
    @DatabaseField(dataType = DataType.LONG) 
    long WorkspaceId;
    @DatabaseField(dataType = DataType.INTEGER)
    int Momentum;
    @DatabaseField(dataType = DataType.BOOLEAN)
    boolean isDeleted;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    Long createdAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    Long editedAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    Long deletedAt;
    @DatabaseField(dataType = DataType.BOOLEAN)
    boolean isNew;
    @DatabaseField(dataType = DataType.INTEGER)
    private int year;
    @DatabaseField(dataType = DataType.INTEGER)
    private int month;
    @DatabaseField(dataType = DataType.INTEGER)
    private int day;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long UserId;
    @DatabaseField(dataType = DataType.STRING)
    private String UserName;
    @DatabaseField(dataType = DataType.INTEGER)
    private int order;
}
public class List  {

    @DatabaseField(dataType = DataType.INTEGER, generatedId = true)
    private int id;
    @DatabaseField(dataType = DataType.LONG)
    private long ActionListId = -1;
    @DatabaseField(dataType = DataType.STRING)
    private String Name;
    @DatabaseField(dataType = DataType.LONG)
    private long WorkspaceId;
    @DatabaseField(dataType = DataType.STRING)
    private String day;
    @DatabaseField(dataType = DataType.SERIALIZABLE, canBeNull = true)
    private int[] date;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean parkingLot;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long CreatedAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long EditedAt;
    @DatabaseField(dataType = DataType.LONG_OBJ)
    private Long DeletedAt;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean IsDeleted;
    @DatabaseField(dataType = DataType.BOOLEAN)
    private boolean isNew;
    @DatabaseField(dataType = DataType.INTEGER)
    private int taskCount;
    @DatabaseField(dataType = DataType.INTEGER)
    private int Order;
}

Примечание: я уже читал эти посты: ORMLite плохая производительность на Android?, это: Ormlite DAO в Android становится очень медленным при запросе более нескольких тысяч результатов. Как я могу улучшить этот метод загрузки объектов с помощью ORMLite на Android? А также я прочитал это: OROlite createOrUpdate кажется медленным - что такое нормальная скорость? и дело в том, что для этих 1500+ создание элементов идет нормально, но этот запрос работает слишком медленно:

      try {
            dao = (TaskDao) DatabaseSingleton.getDAO(Task.class);
            QueryBuilder<Task, Integer> qB = dao.queryBuilder();
            qB.where().eq("WorkspaceId", workspaceId).and().eq("isDeleted", false);
            CloseableIterator<Task> iterator = dao.iterator(qB.prepare());
             try {
                 while (iterator.hasNext()) {
                     Task item  = iterator.next();
                     ActionDto outputItem = new ActionDto(item);
                     list.add(outputItem);
                 }
             } finally {
                 iterator.close();
             }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Так что итератор здесь не поможет

Еще одно замечание: я читал о медленных аннотациях и о том, что они были исправлены в Gingerbread, поэтому я хочу сказать, какие устройства я использую:

  1. Samsung GT-S5660 Galaxy Gio с 2.3.3 API
  2. Эмулятор GenyMotion Nexus 5 4.4.2
  3. Nexus 7 с 4.1.2 API

И все они работают медленно, я думал, что это может быть как-то связано с большим количеством LONG_OBJECT в моих классах и количеством полей в каждом из них, но на самом деле это занимает так много времени, чтобы загрузить 1500+ элементов (10+ секунд)

А также я не хочу менять ORM, потому что ORMLite работал отлично для меня, за исключением этого случая

Редактировать: Как было сказано в комментариях, я должен сказать, что просто qB.query() занимает почти столько же времени, сколько iterator петля

0 ответов

Другие вопросы по тегам