database - software - ¿Completa la base de datos de Android desde un archivo CSV?
programa para ver archivo csv (2)
¿Es posible tomar un archivo csv almacenado en el directorio res / raw y usarlo para completar una tabla en la base de datos sqlite3?
Mi idea era que, si había una forma de hacer una importación masiva para todo el archivo en la tabla, entonces eso sería más limpio y más rápido que iterar sobre cada línea en el archivo y ejecutar instrucciones de inserción individuales ...
He encontrado que hay un comando de importación sqlite que permite esto: ¿Cómo importar cargar un archivo .sql o .csv en SQLite?
... pero estoy teniendo problemas para aplicar esas declaraciones en mi aplicación de Android. Lo primero que pensé fue intentar algo como lo siguiente ... pero no tuve suerte:
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
db.execSQL(".mode csv");
db.execSQL(".import res/raw/MyFile.csv " + TABLE_NAME);
es posible?
¿Debo intentar un enfoque diferente para poblar mi base de datos?
ACTUALIZACIÓN: estoy marcando la respuesta de Josef como la respuesta (inserción masiva usando transacciones) porque funciona bien y responde directamente mi pregunta en función de mi título (gracias Josef). Sin embargo, todavía estoy buscando una forma de hacer una inserción masiva en una aplicación de Android desde un archivo csv en una tabla sqlite3 utilizando la declaración de importación. Si sabes cómo hacerlo, responde.
Gracias por tus respuestas!
Pasé mucho tiempo buscando una solución simple y se me ocurrió este código. Para las personas futuras que busquen esto como yo, tú puedes usar esto:
BufferedReader in = new BufferedReader(your csv file source here);
String reader = "";
while ((reader = in.readLine()) != null){
String[] RowData = reader.split(",");
date = RowData[0];
value = RowData[1];
ContentValues values = new ContentValues();
values.put(CsvProvider.DATE, date);
values.put(CsvProvider.VALUE, value);
getContentResolver().insert(CsvProvider.CONTENT_URI, values);
}
in.close();
Mi archivo CSV
no tiene títulos y solo tiene 2 columnas, pero más de dos columnas no deberían ser un problema. Simplemente recuerde especificar qué divide sus columnas y para cada columna agregue otro RowData[#]
(debe comenzar con 0). Desea asegurarse de que todo lo que va a hacer con cada línea esté listo antes de llamar a in.close()
. Estoy usando un proveedor de contenido, pero realmente puedes hacer lo que quieras con los datos, como agregarlo a una String[]
o cualquier otra cosa.
Mientras estoy usando un flujo de entrada, puede apuntar el BufferedReader a donde quiera. Siempre que BufferedReader
pueda leerlo, funcionará.
Si desea empaquetar datos estáticos con su aplicación, le recomiendo que prepare la base de datos en el momento del desarrollo (usando cualquier UI o comando de importación csv que desee) y envíe el archivo sqlite dentro de la carpeta de activos. A continuación, puede simplemente copiar el archivo sqlite completo en el dispositivo cuando se ejecuta por primera vez la aplicación. These posts guían a través de esta idea, que probablemente sea la manera más rápida de configurar una base de datos (velocidad de copia de archivo).
Si, por algún motivo, necesita insertar una gran cantidad de datos en tiempo de ejecución, le recomiendo que busque maneras de insertar a granel usando transacciones para acelerarlo.