Aller au contenu

Recommended Posts

Posté(e)

Donc, aucun droit en écriture. Probablement que tu n'as pas configuré de SD card pour cet émulateur

Dans le 'Android SDK and AVD manager', quand tu affiches les détails de ta configuration émulateur, est-ce que tu as une indication de taille de SD card ?

Posté(e)

Chpil, voila j'ai essayé autre chose vu que je n'arrive pas à écrire sur le sd card.

J'ai crée un fichier dans le package com.projet, grâce à fileoutputstream.

voila le code:

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

       bd = new DBAdapter(this);
       bd.open();
       Cursor cursor1 = bd.ExportPersonne();

	try {

		FileOutputStream fos = this.openFileOutput("test.csv", Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
		DataOutputStream dos = new DataOutputStream(fos);

		int idIndex = cursor1.getColumnIndexOrThrow("_id");
		dos.write(idIndex);
}
catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

Le problème maintenant est que le fichier test.csv est vide même si sa taille est 1Ko, quand je change

int idIndex = cursor1.getColumnIndexOrThrow("nom");

Il m'affiche dans la case du fichier un point d'interogation.

Et quand je veux afficher juste "hello word" ça marche:

dos.write("Hello World".getBytes());;

pour le logcat il n'ya pas d'erreurs.

Posté(e)

Il ne faut pas utiliser DataOutputStream, c'est pour écrire du binaire, alors que tu veux écrire du texte dans ton fichier

Utilise OutputStreamWriter en lieu et place de FileWriter dans le code que je t'avais indiqué précédemment

Posté(e)

J'ai remplacé DataOutputStream par OutputStreamWriter, mais le fichier test.csv reste vide.

Je ne sais pas ou est ce qu'il faut placer FileWriter vu qu'il y a déja OutputStreamWriter pour l'ecriture.

Posté(e)

Il faut changer le type du writer de FileWriter en OutputStreamWriter !

   FileOutputStream fos = this.openFileOutput("test.csv", Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
   OutputStreamWriter writer = new OutputStreamWriter(fos);

   // ...

Posté(e) (modifié)

Oui c'est ce que j'ai fait.

       
Cursor cursor1 = bd.ExportPersonnes();
	try {

		FileOutputStream fos = this.openFileOutput("test.csv", Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
		OutputStreamWriter dos = new OutputStreamWriter(fos);


		int idIndex = cursor1.getColumnIndexOrThrow("_id");
		dos.write(idIndex);
}

Modifié par nathalie85
Posté(e)

Et ? Est-ce que tu comprends ce que tu fais ? As-tu regardé la Javadoc de OutputStreamWriter ? Pourquoi veux-tu sortir dans ton fichier la valeur de idIndex ? idIndex contient le numéro de la colonne "_id" dans le Cursor. C'est un entier. Et un Writer, ça sert à écrire des caractères dans un flux. Dans ton cas, idIndex va valoir quelque chose comme 1 ou 2, et dos.write(idIndex) va écrire dans le fichier le caractère de code 1 ou 2, caractère non imprimable, donc tu ne risques pas de voir grand chose dans ton fichier... Si c'est tester l'écriture dans ton fichier que tu veux faire, fais au moins un dos.write("Ma chaine de caractères de test");

(Je suppose que tu n'as mis qu'un extrait du code de ta méthode, et qu'il y a bien par la suite fermeture de ton flux/ton fichier ( dos.close(); fos.close(); ) ? )

Posté(e)

Je t'ai déjà donné la réponse, il me semble !! Il te suffisait juste d'adapter avec un OutpuStreamWriter au lieu d'un FileWriter

Allez, c'est mon jour de bonté :


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

       Cursor cursor1 = bd.ExportPersonnes();
       try {
           FileOutputStream fos = this.openFileOutput("test.csv", Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
           OutputStreamWriter writer = new OutputStreamWriter(fos);

           int idIndex = cursor1.getColumnIndexOrThrow("_id");
           int nomIndex = cursor1.getColumnIndexOrThrow("nom");
           int prenomIndex = cursor1.getColumnIndexOrThrow("prenom");
           int ageIndex = cursor1.getColumnIndexOrThrow("age");

           while (!cursor1.isAfterLast())
           {
               StringBuilder buffer = new StringBuilder();
               String idPers = cursor1.getString(idIndex);
               String nomPers = cursor1.getString(nomIndex);
               String prenomPers = cursor1.getString(prenomIndex);
               String agePers = cursor1.getString(ageIndex);

               buffer.append(idPers);
               buffer.append(';');  
               buffer.append(nomPers);
               buffer.append(';');  
               buffer.append(prenomPers);
               buffer.append(';'); 
               buffer.append(agePers);

               buffer.append("\n");

               writer.write(buffer.toString());

               cursor1.moveToNext();}

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

Posté(e)

J'ai ces erreurs quand je compile:

03-09 08:23:23.291: ERROR/AndroidRuntime(302): FATAL EXCEPTION: main
03-09 08:23:23.291: ERROR/AndroidRuntime(302): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projet.Projet/com.projet.Projet.Main}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 8
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.os.Looper.loop(Looper.java:123)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at java.lang.reflect.Method.invokeNative(Native Method)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at java.lang.reflect.Method.invoke(Method.java:521)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at dalvik.system.NativeStart.main(Native Method)
03-09 08:23:23.291: ERROR/AndroidRuntime(302): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 8
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at com.projet.Projet.Main.onCreate(Main.java:50)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-09 08:23:23.291: ERROR/AndroidRuntime(302):     ... 11 more

as-tu une idée?

Merci d'avance.

Posté(e)

Caused by: android.database.CursorIndexOutOfBoundsException

autre ment dit tu as une erreur à la ligne 50 de ta classe Main

surement quand tu fait tes getColumnIndexOrThrow v"rifie en mode débug si ton index est valide.

Posté(e)

Je pense qu'il manque un moveToFirst sur le Cursor (oubli de ma part)

       Cursor cursor1 = bd.ExportPersonnes();
       cursor1.moveToFirst();
       ...

Posté(e)

C'était bien ça, merci beaucoup pour ton aide.

juste une dernière question, est ce que c'est possible de récupérer toute la base de donnée donc toutes les tables au même temps.

Posté(e)

C'est sûrement possible. Soit tu sais faire une requête SQL unique pour récupérer toutes les données de toutes les tables en une seule fois. Soit au pire tu fais plusieurs requêtes, pour les différentes tables

Mais, au final, seule toi peut savoir ce qui est possible, en fonction de la façon dont tu vas présenter les données dans le fichier de sortie, et en fonction de la structure de ta base...

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