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í:

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!!

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

  • Compartir base de datos sqlite entre varias actividades de Android
  • No se puede abrir el error de archivo de base de datos al utilizar consultas posteriores
  • Cómo ver la base de datos de aplicación de Android que se ejecuta en mi teléfono
  • Cómo instalar o obtener acceso a sqlite3 de adb shell
  • ¿Cuáles son las mejores prácticas para SQLite en Android?
  • CompileStatement o db.insert en android
  • Android SQLite Error "solicitando nombre de columna con nombre de tabla"
  • Inspeccionar la base de datos android de sql desde Eclipse
  • Android: La ventana del cursor está llena
  • Base de datos sqlite pre-relleno android
  • Configuración de Proguard para enlaces sqlite android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.