Aller au contenu

Accés aux données


Recommended Posts

En fonction de ce que tu entends par 'fichier Excel', ce peut être plus ou moins simple.

Si le fichier résultat doit avoir le format propriétaire Excel (un vrai .xls), alors il faudrait s'appuyer sur une librairie qui peut générer ce format; je ne sais pas si une telle librairie est disponible sur la plateforme Android.

S'il s'agit simplement de générer un fichier au format CSV, cela est assez simple; il suffit de parcourir le Cursor qui correspond à tes données, et de générer le fichier ligne par ligne.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

Voila j'aimerai exporté les données de ma base SQLite dans un fichier Excel à partir de mon application à l'aide d'un menu ou un bouton....

Mais je ne sais pas pas comment procéder.

Des idées??

Merci d'avance.

Salut,

J'ai vu dans un sujet précédent que tu voulais mettre en place un formulaire, as tu réussis ?

je connais le même genre de problème avec ma base de données et j'aimerais te demander des conseils.

D'avance merci

Lien vers le commentaire
Partager sur d’autres sites

oui chpil c'est un fichier au format CSV, as tu un exemple?

Non, désolé, je n'ai pas d'exemple sous la main

Mais, sincèrement, ce n'est pas très difficile à mettre en oeuvre

J'ai vu dans un sujet précédent que tu voulais mettre en place un formulaire, as tu réussis ?

je connais le même genre de problème avec ma base de données et j'aimerais te demander des conseils.

Pour la bonne lisibilité de ce forum, il aurait été préférable que tu poses ta question dans le thread auquel tu fais référence, plutôt que dans celui-ci

Lien vers le commentaire
Partager sur d’autres sites

oui chpil c'est un fichier au format CSV, as tu un exemple?

je n'ai pas encore touché a la partie SQLite.. mais une de mes techniques SQL pour exporter en .csv est de rajouter "," apres chaque champs lors de ton select

select champ1 + "," + champs2 + "," from table

ca marche aussi avec ";" et les tabulation etc...

et tu ecris sur un fichier text plat avec extension .CSV ligne par ligne tes resultats. ! attention a l'encodage des caracteres !

j'espere t'avoir aider ^^

EDIT : fais attention a la conversion automatique quand tu fais le + ...

Modifié par SlayTaniK
Lien vers le commentaire
Partager sur d’autres sites

Je ne conseillerais pas de faire ainsi:

- c'est déporter dans le moteur de base de données, qui n'est pas fait pour cela, la gestion de la génération du résultat (formatage, encodage, etc..)

- cela va à l'encontre de la façon de récupérer les résultats issus de la base de données d'Android, au travers des Cursors, qui est orientée 'champ' (via les getString/getInt/...)

Il est préférable d'implémenter la génération des lignes du fichier résultat en code Java, et de pouvoir gérer plus facilement formatage, encodage et autres

Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

Je reviens vers toi chpil, je suis entrain de faire ce que tu m'as dit pour l'export des données sqlite.

J'ai fait un cursor:

	public Cursor ExportPersonnes(){
	return bd.query("personne", new String[]{
		"_id",
		"nom",
		"prenom",
		"age"},null, null, null, null, null);
}

Et ensuite j'appelle ce cursor:

protected void onCreate(Bundle savedInstanceState) {

	setContentView(R.layout.main);
	super.onCreate(savedInstanceState);

	bd = new DBAdapter(this);
	bd.open();

	Cursor cursor1 = bd.ExportPersonnes();

Mais par contre pour la suite "générer le fichier ligne par ligne" je ne sais pas comment le faire, je n'ai pas trouvé non plus comment écrire dans un fichier csv sous android.

Si tu as des idées, elles seront les bienvenus.

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Grosso-modo, en presque pseudo-code, ça pourrait ressembler à ça:


 FileWriter writer = ... // création du FileWriter, en fonction de l'endroit où stocker le fichier
 int idIndex = cursor1.getColumnIndexOrThrow("_id");
 // .. idem pour les autres colonnes
 while (!cursor1.isAfterLast())
 {
   StringBuilder buffer = new StringBuilder(); // ou new StringBuilder(taille) si tu as une bonne idée de la taille d'une ligne, ce qui évitera des allocations mémoire intempestives...
   String idPers = cursor1.getString(idIndex);
   // Idem pour les autres colonnes
   builder.clear();
   builder.append(idPers);
   builder.append(';');  // séparateur
   // idem pour les autres colonnes
   ...
   builder.append("\n");
   writer.write(builder.toString());
   cursor1.moveToNext();
 }
 writer.close();

Code perfectible, qui ne doit pas compiler tel quel (il faut au moins lui rajouter la gestion des exceptions); pour bien faire, il faudrait aussi gérer l'escaping des séparateurs qui peuvent apparaître dans les valeurs des colonnes

Edit: manquait un moveToNext() dans le code

Modifié par chpil
Lien vers le commentaire
Partager sur d’autres sites

Merci chpil pour ta réponse.

J'ai essayé ton code

	protected void onCreate(Bundle savedInstanceState) { 
	setContentView(R.layout.main);
       super.onCreate(savedInstanceState);

       bd = new DBAdapter(this);
       bd.open();

       Cursor cursor1 = bd.ExportPersonnes();
       FileWriter writer;
	try {
		writer = new FileWriter("C:\test.csv");

       int idIndex = cursor1.getColumnIndexOrThrow("_id");
       // .. idem pour les autres colonnes
       while (!cursor1.isAfterLast())
       {
         StringBuilder buffer = new StringBuilder(); // ou new StringBuilder(taille) si tu as une bonne idée de la taille d'une ligne, ce qui évitera des allocations mémoire intempestives...
         String idPers = cursor1.getString(idIndex);
         // Idem pour les autres colonnes
         /*buffer.clear();*/
         buffer.append(idPers);
         buffer.append(';');  // séparateur
         // idem pour les autres colonnes

         buffer.append("\n");

  writer.write(buffer.toString());

         cursor1.moveToNext();}

  writer.close();
	}
	catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}


}

Mais ça ne marche pas, est ce que j'ai mal mis le try/catch?

Lien vers le commentaire
Partager sur d’autres sites

Déjà, il y a un truc qui ne risque pas de marcher, c'est le nom du fichier dans lequel tu veux écrire: "C:\test.csv", c'est bon pour du Windows, mais sur Android, c'est différent. Un chemin du style "/sdcard/test.csv" serait plus approprié

Et pour faire encore plus propre

 File f = new File(Environment.getExternalStorageDirectory(), "test.csv");
 FileWriter writer = new FileWriter(f);

donne le même résultat

Et si "ça ne marche toujours pas" après cela, stp, essaye d'être un peu plus précise dans la description du problème que tu rencontres (quelle exception se produit ? traces de logs ? ... plutôt qu'un simple "ça ne marche pas" ;) )

Lien vers le commentaire
Partager sur d’autres sites

D'accord dslée, je serai plus précise.

J'ai mis le fichier dans la racine du projet dans le workspace et j'ai écrit:

File f = new File("/Projet/test.csv");
 FileWriter writer = new FileWriter(f);

et j'ai les erreurs suivantes:

03-03 15:25:27.737: WARN/System.err(304): java.io.FileNotFoundException: /Projet/test.csv (No such file or directory)
03-03 15:25:27.957: WARN/System.err(304):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
03-03 15:25:27.957: WARN/System.err(304):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
03-03 15:25:27.967: WARN/System.err(304):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
03-03 15:25:27.967: WARN/System.err(304):     at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
03-03 15:25:27.967: WARN/System.err(304):     at java.io.FileWriter.<init>(FileWriter.java:42)
03-03 15:25:27.977: WARN/System.err(304):     at com.projet.Projet.Main.onCreate(Main.java:28)
03-03 15:25:27.977: WARN/System.err(304):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 15:25:27.987: WARN/System.err(304):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-03 15:25:27.987: WARN/System.err(304):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-03 15:25:27.999: WARN/System.err(304):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-03 15:25:27.999: WARN/System.err(304):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-03 15:25:28.008: WARN/System.err(304):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 15:25:28.008: WARN/System.err(304):     at android.os.Looper.loop(Looper.java:123)
03-03 15:25:28.018: WARN/System.err(304):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-03 15:25:28.018: WARN/System.err(304):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 15:25:28.028: WARN/System.err(304):     at java.lang.reflect.Method.invoke(Method.java:521)
03-03 15:25:28.037: WARN/System.err(304):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-03 15:25:28.037: WARN/System.err(304):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-03 15:25:28.047: WARN/System.err(304):     at dalvik.system.NativeStart.main(Native Method)

Lien vers le commentaire
Partager sur d’autres sites

Tu n'as pas le droit d'écrire ou tu veux sur android.

De plus il faut avoir créé ton répertoire avant.

Donc soit du fait comme le dit chpil et tu le mets sur la sdcard, soit tu le mets dans ton tel mais sans mettre un / au début du chemin et la il sera dans le répertoire de ton appli. (bon courage pour le retrouver après

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

http://developer.android.com/reference/java/io/File.html

Modifié par moritan
Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé d'accéder à la sdcard pour mettre le fichier et pouvoir écrire"/sdcard/test.csv", mais la console me répond que l'exécutable est introuvable.

Il y a t 'il un autre emplacement ou je peux mettre mon fichier?(je travaille avec un emulateur)

Modifié par nathalie85
Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé ce que tu m'as dit chpil :

  File f = new File(Environment.getExternalStorageDirectory(), "test.csv");
 FileWriter writer = new FileWriter(f);

et voila ce que dit le logcat:

03-03 16:34:33.437: WARN/System.err(389): java.io.FileNotFoundException: /mnt/sdcard/test.csv (Permission denied)
03-03 16:34:33.499: WARN/System.err(389):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
03-03 16:34:33.499: WARN/System.err(389):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
03-03 16:34:33.507: WARN/System.err(389):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
03-03 16:34:33.524: WARN/System.err(389):     at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
03-03 16:34:33.528: WARN/System.err(389):     at java.io.FileWriter.<init>(FileWriter.java:42)
03-03 16:34:33.538: WARN/System.err(389):     at com.projet.Projet.Main.onCreate(Main.java:31)
03-03 16:34:33.538: WARN/System.err(389):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 16:34:33.548: WARN/System.err(389):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-03 16:34:33.548: WARN/System.err(389):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-03 16:34:33.557: WARN/System.err(389):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-03 16:34:33.557: WARN/System.err(389):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-03 16:34:33.567: WARN/System.err(389):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 16:34:33.577: WARN/System.err(389):     at android.os.Looper.loop(Looper.java:123)
03-03 16:34:33.587: WARN/System.err(389):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-03 16:34:33.587: WARN/System.err(389):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 16:34:33.587: WARN/System.err(389):     at java.lang.reflect.Method.invoke(Method.java:521)
03-03 16:34:33.598: WARN/System.err(389):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-03 16:34:33.608: WARN/System.err(389):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-03 16:34:33.608: WARN/System.err(389):     at dalvik.system.NativeStart.main(Native Method)

Sachant que le fichier test.csv est dans le workspace eclipse à la racine du projet.

Lien vers le commentaire
Partager sur d’autres sites

Si tu as la permission adéquate dans le androidManifest.xml, tu ne devrais pas avoir cette erreur. Pour autant, tu as un accès refusé lors de la création du fichier...

As-tu bien une SD card (simulée) dans ton émulateur ? (on l'indique quand on crée la première fois la configuration de l'émulateur)

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...