GreenDAO 40 секунд для вставки 600 записей
Я выбрал greenDAO, потому что сайт указывает, что это одна из самых быстрых систем ORM для Android. К моему разочарованию он занимает 40 секунд, чтобы вставить 600 записей на Samsung i9001. Я не уверен, что я делаю что-то неправильно.
Не могли бы вы предложить что-нибудь, чтобы уменьшить время, необходимое для выполнения этих операций?
код генератора:
private static void addNewsArticle(Schema schema) {
Entity article = schema.addEntity("NewsArticle");
article.addIdProperty().autoincrement();
article.addStringProperty("title").notNull();
article.addStringProperty("body").notNull();
article.addStringProperty("shortDescription").notNull();
article.addStringProperty("thumb");
article.addDateProperty("date").notNull();
}
Вставка
Date now = Calendar.getInstance().getTime();
for (int i = 0; i < 600; i++) {
NewsArticle testArticle = new NewsArticle();
testArticle.setTitle("title-text" + i);
testArticle.setBody("body-text" + i);
testArticle.setShortDescription("short-text" + i);
testArticle.setDate(now);
newsArticleDao.insert(testArticle);
}
Ответы
Ответ 1
Как я подозревал, в одном заявлении sql не выполнялось никаких действий. Для этого просто используйте insertInTx для объекта DAO.
Здесь приведенный выше код с небольшими изменениями, которые заставляют его запускать наполовину
NewsArticle[] newsArticles = new NewsArticle[600];
NewsArticle testArticle;
for (int i = 0; i < 600; i++) {
testArticle = new NewsArticle();
testArticle.setTitle("title-text" + i);
testArticle.setBody("body-text" + i);
testArticle.setShortDescription("short-text" + i);
testArticle.setDate(now);
newsArticles[i] = testArticle;
}
newsArticleDao.insertInTx(newsArticles);
Ответ 2
вы также можете создать новый Runnable, который выполняет все вставки в функции DaoSession.runInTx
daoSession.runInTx(new Runnable {
public void run(){
Date now = Calendar.getInstance().getTime();
for (int i = 0; i < 600; i++) {
NewsArticle testArticle = new NewsArticle();
testArticle.setTitle("title-text" + i);
testArticle.setBody("body-text" + i);
tesArticle.setShortDescription("short-text" + i);
testArticle.setDate(now);
newsArticleDao.insert(testArticle);
}
}
});
Ответ 3
Здесь приведена отличная статья об ускорении операций вставки SQLITE для Android.
Попробуйте это, я мог бы значительно оптимизировать скорость модулей синхронизации с 1,2 часа до 14 минут при синхронизации 39 МБ DB.
http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/
Сообщите мне, если вам нужны кодовые спиннеты.
Ответ 4
Я попробовал ниже сказанное и получил лучшую производительность
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db-name",
null);
SQLiteDatabase dbGreen= helper.getWritableDatabase();
dbGreen.beginTransaction();
//Perform your insertion here
dbGreen.setTransactionSuccessful();
dbGreen.endTransaction();