GreenDAO 40 segundos para insertar 600 registros
He elegido greenDAO porque su sitio afirma que es uno de los sistemas ORM más rápidos para Android. Para mi decepción se tarda como 40 segundos para insertar 600 registros en Samsung i9001. No estoy seguro si estoy haciendo algo malo.
¿Podría sugerir algo para disminuir la cantidad de tiempo que se tarda en realizar esas operaciones?
- Android: ¿Cómo usar greenDao para los datos de carga asíncrona?
- Generador greenDAO da error de consola que no tiene sentido
- GreenDAO se unió a la izquierda
- Persistencia de entidades bidireccionales con Green-DAO
- GreenDAO - clave primaria en varias columnas
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); }
- Utilizando más de 1 base de datos en Greendao con 2 esquemas diferentes - Android
- Android greenDAO Almacenamiento Números de punto flotante incorrectos
- Claves principales de greendao string - cómo usar
- ¿Cómo construyo una consulta de GreenDao que carga todos los artículos especificados a través de una lista de identificadores?
- Greendao: manera de depurar consultas?
- El grupo de conexiones no ha podido conceder una conexión a subproceso
- En GreenDao, genere una consulta de unión con OR en lugar de AND
- Actualización del esquema greenDao
Como sospeché que las cosas no se ejecutaron dentro de una sola declaración de sql. Para lograrlo, simplemente use insertInTx en un objeto DAO.
Aquí está el código anterior con ligeros cambios que lo hacen correr como medio 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);
También puede crear un nuevo Runnable que haga 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); } } });
Un excelente artículo sobre la aceleración de SQLITE insertar operaciones para Android se da aquí. Tryout esto podría optimizar la velocidad de los módulos de sincronización dramáticamente de 1.2 horas a 14 minutos en la sincronización DB de 39MB.
http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/
Avísame en caso de que necesites spinnets de código.
Intenté abajo mencionado y conseguí el mejor funcionamiento
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db-name", null); SQLiteDatabase dbGreen= helper.getWritableDatabase(); dbGreen.beginTransaction(); //Perform your insertion here dbGreen.setTransactionSuccessful(); dbGreen.endTransaction();
- Delphi XE5 Serial Port en Android
- Android: cuando se utiliza LocationManager.requestLocationUpdates, ¿necesito un WakeLock?