IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème avec le Cursor


Sujet :

Android

  1. #1
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut Problème avec le Cursor
    Bonjour,


    Je suis en train de mettre en place une application capable de lire des sms.

    Pour lire les Sms je fais le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
            final ListView listView = (ListView)findViewById(R.id.receiveSMS);
     
            Uri uri = Uri.parse("content://sms/inbox");
             c= getContentResolver().query(uri, null, null ,null,null);
            startManagingCursor(c);
        List<SmsData> listInput = new ArrayList<SmsData>();
            // Read the sms data and store it in the list
            if(c.moveToFirst()) {
                for(int i=0; i < c.getCount(); i++) {
     
                    String phone = c.getString(c.getColumnIndexOrThrow("address")).toString();
                    String body = c.getString(c.getColumnIndexOrThrow("body")).toString();
                    SmsData smsdata = new SmsData();
                    smsdata.setNumber(phone);
                    smsdata.setBody(body);
     
                    listInput.add(smsdata);
     
                    c.moveToNext();
                }
            }
     
    c.close();

    Apres avoir sélectionner un message de la liste, une nouvelle page (Activity) est ouverte affichant le message.
    Mais lorsque je reviens sur la page précédente j'ai le bug suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: rexad.com.smsdatacollect, PID: 4555
                      java.lang.RuntimeException: Unable to resume activity {rexad.com.smsdatacollect/rexad.com.smsdatacollect.ReceiveDataActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
                          at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2986)
                          at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:135)
                          at android.app.ActivityThread.main(ActivityThread.java:5254)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:372)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                       Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
                          at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
                          at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133)
                          at android.database.CursorWrapper.requery(CursorWrapper.java:186)
                          at android.app.Activity.performRestart(Activity.java:6042)
                          at android.app.Activity.performResume(Activity.java:6068)
                          at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
                          at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)*
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)*
                          at android.os.Handler.dispatchMessage(Handler.java:102)*
                          at android.os.Looper.loop(Looper.java:135)*
                          at android.app.ActivityThread.main(ActivityThread.java:5254)*
                          at java.lang.reflect.Method.invoke(Native Method)*
                          at java.lang.reflect.Method.invoke(Method.java:372)*
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)*
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)*
    Je vois bien que c'est la gestion du Cursor qui pose problème.

    Comment gérer correctement le Cursor pour pouvoir revenir sur la page apres avois fermé le Cursos.


    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Une fois le cursor clos, tu ne peux plus l'utiliser. Tu peux donc conserver le cursor en tant que variable d'instance dans ton Activiru, ou le recréer dans le onResume.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre actif Avatar de L4BiN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2006
    Messages : 432
    Points : 209
    Points
    209
    Par défaut
    Merci Hizin,


    J'ai utilisé le CursorLoader à travers l'implémentation de LoaderManager.LoaderCallbacks<Cursor>.


    Cela semble bien fonctionner, bien que je ne soit pas sure que le cursor soit convenablement fermé.

Discussions similaires

  1. Problème avec un cursor
    Par *alexandre* dans le forum Développement
    Réponses: 4
    Dernier message: 12/03/2009, 08h59
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo