Подтвердить что ты не робот

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);
}
4b9b3361

Ответ 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();