web-dev-qa-db-fra.com

Remplir Android Base de données à partir d'un fichier CSV?

Est-il possible de prendre un fichier csv stocké dans le répertoire res/raw resource et de l'utiliser pour remplir une table dans la base de données sqlite3?

Ma pensée était que, s'il y avait un moyen d'importer en bloc le fichier entier dans la table, ce serait plus propre et plus rapide que d'itérer sur chaque ligne du fichier et d'exécuter des instructions d'insertion individuelles ...

J'ai trouvé qu'il existe une commande sqlite import qui permet ceci: Comment importer charger un fichier .sql ou .csv dans SQLite?

... mais j'ai du mal à appliquer ces déclarations dans mon Android. Ma première pensée a été d'essayer quelque chose comme ce qui suit ... mais pas de chance:

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

Est-ce possible?

Dois-je essayer une approche différente pour remplir ma base de données?

MISE À JOUR: Je marque la réponse de Josef comme la réponse (insertion en masse à l'aide de transactions) car cela fonctionne bien et répond directement à ma question en fonction de mon titre (merci Josef). Cependant, je suis toujours à la recherche d'un moyen de faire une insertion en bloc dans une application Android du fichier csv dans une table sqlite3 en utilisant l'instruction d'importation. Si vous savez comment faire, veuillez répondre .

Merci pour vos réponses!

29
MoMo

Si vous souhaitez empaqueter des données statiques avec votre application, je recommande de préparer la base de données au moment du développement (à l'aide de n'importe quelle commande d'interface utilisateur ou d'importation csv que vous aimez) et d'expédier le fichier sqlite dans le dossier d'actifs. Vous pouvez ensuite simplement copier l'intégralité du fichier sqlite sur l'appareil lors de la première exécution de votre application. Ceux-cimessages vous emmènent à travers cette idée qui est probablement le moyen le plus rapide de configurer une base de données (vitesse de copie des fichiers).

Si, pour une raison quelconque, vous avez besoin d'insérer beaucoup de données au moment de l'exécution, je vous recommande de chercher des moyens de insertion en masse à l'aide de transactions pour l'accélérer.

31
Josef Pfleger

J'ai passé beaucoup de temps à chercher une solution simple et j'ai moi-même trouvé ce petit bout de code. Pour les futures personnes qui le recherchent comme moi, vous pouvez utiliser ceci:

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

Mon fichier CSV n'a pas de titres et n'a que 2 colonnes mais plus de deux colonnes ne devraient pas être un problème. N'oubliez pas de spécifier ce qui divise vos colonnes et pour chaque colonne, ajoutez un autre RowData[#] (Vous devez commencer par 0). Vous voulez vous assurer que tout ce que vous allez faire avec chaque ligne est fait avant d'appeler in.close(). J'utilise un fournisseur de contenu, mais vous pouvez vraiment faire tout ce que vous voulez avec les données comme l'ajouter à un String[] Ou autre chose.

Pendant que j'utilise un flux d'entrée, vous pouvez pointer le BufferedReader là où vous le souhaitez. Tant que BufferedReader peut le lire, cela fonctionnera.

14
Opy