Primera vez Cursor Operación es tan lento, cuando la consulta de datos a granel. ¿Cómo resolver?
Tengo que consultar tres tabla, y mostrar los datos a mi customerView.
Mi código es así:
- Programa ejemplo sqlite en android
- ¿Cuál es el propósito de startManagingCursor?
- Filtrar el parámetro ListView por 'selección' en CursorLoader
- Android SQLite ON CONFLICT UPDATE es posible?
- Cursor.getType () y CursorIndexOutOfBoundsException excepción
Log.v(TAG, System.CurrentTimeMillis()) int len = cursor.getCount(); Log.v(TAG, System.CurrentTimeMillis()) Product[] products = new Product[len]; int i = 0; while(cursor.moveToNext()){ products[i] = new Product(cursor.getstring(0),.....); } Log.v(TAG, System.CurrentTimeMillis())
Consulta Sqlite:
String sql = "SELECT T1.PRODUCT_ID, CODE, SHORT_DESCRIPTION, CATEGORY_CODE, BRAND_CODE, FORM_CODE, DENOMINATOR, T1.PIECE_PRICE, T1.lowest_piece_price, T2.sku_type, T1.master_sku " + "FROM CUSTOMER_PROD_LIST_ITEMS T1 INNER JOIN PRODUCT T2 ON T1.PRODUCT_ID = T2.ID INNER JOIN PRODUCT_UOMS ON T2.ID = PRODUCT_UOMS.PRODUCT_ID"+ "WHERE T1.VALID = 1 AND PRODUCT_UOMS.VALID = 1 AND CUSTOMER_PRODUCT_LIST_ID = " + customer_pdtlist_ID + " ORDER BY T1.PRODUCT_ID ASC";
Después de mi prueba, si tenemos 1500rows en el cursor, tenemos que pasar más de 30s para terminar esta línea (cursor.getcount ()). Si elimino esta línea, y uso ArrayList para tener lugar. puedo encontrar que debemos gastar más de 30s para Cursor.moveToNext ().
Así que mi pregunta es ¿por qué la operación de cursor por primera vez debe tomar tanto tiempo? y ¿cómo solucionamos?
Y este hombre tiene la misma pregunta Implementación SQLite pobre? La primera vez que se accede a los datos es demasiado lento . pero la respuesta no está funcionando para mí. por cierto, me parece mostrar los mismos 1500rows en Iphone, sólo necesito 3s amost.
¡¡gracias por adelantado!!
- Optimización de SQLite para aplicaciones de Android
- Consulta Sqlite que devuelve 0 incluso si el valor es nulo.
- SQLite - No se pudo abrir el archivo de base de datos
- SQLiteDatabase.execSQL no funciona como se esperaba para la consulta INSERT INTO
- Android: ¿Cómo acceder a una sola base de datos de múltiples actividades en la aplicación?
- java.lang.NullPointerException error en una consulta
- El antiguo constructor de SimpleCursorAdapter desaprobó .. realmente?
- Error de "Error al abrir la base de datos" al copiar una base de datos sqlite de activos En Android 4.2
Esta es una respuesta a por qué la primera operación en su cursor es tan lenta. Cuando un Cursor está respaldado por SQLite, Android utiliza la biblioteca sqlite C internamente y crear un Cursor
es análogo a crear una sentencia preparada en la biblioteca C. Crear una declaración preparada es barato y no realiza ninguna consulta. Tomado de la documentación de la biblioteca C:
sqlite3_prepare ()
Esta rutina convierte el texto SQL en un objeto de sentencia preparado y devuelve un puntero a ese objeto. Esta interfaz requiere un puntero de conexión de base de datos creado por una llamada anterior a sqlite3_open () y una cadena de texto que contiene la instrucción SQL que se preparará. Esta API realmente no evalúa la instrucción SQL. Simplemente prepara la sentencia de SQL para la evaluación.
Cuando llama a moveToNext()
en el Cursor
, eso es cuando la consulta realmente se ejecuta. moveToNext
da moveToNext
resultado una llamada a la sqlite3_step()
en la biblioteca C. De nuevo, tomado de la documentación:
sqlite3_step ()
Esta rutina se utiliza para evaluar una sentencia preparada previamente creada por la interfaz sqlite3_prepare (). La sentencia se evalúa hasta el punto donde está disponible la primera fila de resultados. Para avanzar a la segunda fila de resultados, invoque de nuevo sqlite3_step (). Continúe invocando sqlite3_step () hasta que se complete la instrucción. Las sentencias que no devuelven resultados (por ejemplo, instrucciones INSERT, UPDATE o DELETE) se ejecutan hasta completarse en una sola llamada a sqlite3_step ().
Así que crear un Cursor se hace perezosamente y la consulta sólo se evalúa cuando se mueve el cursor por primera vez.
Para averiguar por qué la consulta está tomando tanto tiempo, utilice EXPLAIN QUERY PLAN
en su consulta y vea dónde se encuentra el cuello de botella. Normalmente es la falta de un índice apropiado.
ok, chicos, no he estado aquí para acouple days.And encontré la solución que es que tienes que crear índice para su tabla que mejorará la velocidad de la consulta. gracias de todos modos