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, поэтому я хочу сказать, какие устройства я использую:
- Samsung GT-S5660 Galaxy Gio с 2.3.3 API
- Эмулятор GenyMotion Nexus 5 4.4.2
- Nexus 7 с 4.1.2 API
И все они работают медленно, я думал, что это может быть как-то связано с большим количеством LONG_OBJECT в моих классах и количеством полей в каждом из них, но на самом деле это занимает так много времени, чтобы загрузить 1500+ элементов (10+ секунд)
А также я не хочу менять ORM, потому что ORMLite работал отлично для меня, за исключением этого случая
Редактировать: Как было сказано в комментариях, я должен сказать, что просто qB.query()
занимает почти столько же времени, сколько iterator
петля