2012-10-05 7 views
11

He elegido greenDAO porque su sitio indica que es uno de los sistemas ORM más rápidos para Android. Para mi decepción, lleva unos 40 segundos insertar 600 registros en Samsung i9001. No estoy seguro si estoy haciendo algo mal.greenDAO 40 segundos para insertar 600 registros

¿Podría sugerir algo para disminuir la cantidad de tiempo que lleva realizar esas operaciones?

generador de código:

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(); 
} 

inserciones

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

Respuesta

36

Como sospechaba cosas no fueron ejecutados en una sola sentencia SQL. Para lograrlo, simplemente use insertInTx en un objeto DAO.

Aquí está el código anterior con ligeros cambios que hacen que se ejecute en que la mitad de un segundo

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); 
+3

guardó mi culo en 3 años antes. – Youtoo

+0

Comprobo la carga de mi base de datos (de 01:30 min a ~ 1s). ¡Muchas gracias!. – VIX

9

también puede crear un nuevo Ejecutable que hace todas las inserciones se ejecuta dentro de la función 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); 
     } 
    } 
}); 
1

Aquí se incluye un excelente artículo sobre cómo acelerar las operaciones de inserción de SQLITE para Android. Tryout this Pude optimizar la velocidad de los módulos de sincronización de forma espectacular de 1.2 horas a 14 minutos en la sincronización de 39MB DB.

http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/

Avísame en caso de que si necesitas spinnets de código.

+0

Ese es un artículo excelente, pero greenDAO ya tiene optimizaciones para el uso de transacciones. La respuesta de la medianoche del usuario es la mejor. –

0

He intentado mencionados a continuación y obtuvo el mejor rendimiento

 DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db-name", 
       null); 
     SQLiteDatabase dbGreen= helper.getWritableDatabase(); 

     dbGreen.beginTransaction(); 

     //Perform your insertion here 
     dbGreen.setTransactionSuccessful(); 
     dbGreen.endTransaction(); 
Cuestiones relacionadas