2011-03-07 3 views
3

J'utilise un CursorAdapter personnalisé pour afficher les données stockées dans une base de données. Les données sont extraites d'un serveur, analysées et insérées dans la base de données dans un thread distinct. Comme je ne veux pas conserver de vieilles données, je supprime toutes les lignes de la table, puis j'insère chaque ligne pendant que j'analyse les informations dans la réponse du serveur. Si je fais défiler dans le ListActivity, je reçois parfois un plantage, apparemment, quand la table est effacée, et CursorAdapter getView ou bindView essayent d'interroger le curseur.Mise à jour de la base de données SQLite dans un fil d'arrière-plan sur Android

Ce n'est pas mon CursorAdapter personnalisé qui échoue, j'ai déjà géré le RuntimeException qui peut arriver quand j'utilise getInt() ou getString(). D'après ce que j'ai lu, la sérialisation des requêtes dépend de la façon dont vous utilisez SQLiteOpenHelpers. J'ai créé un SQLiteOpenHelper personnalisé, similaire à l'exemple du bloc-notes dans les démos Android.

Quand je mets à jour mon db j'utilise l'extrait de code suivant:

ContentResolver cr = ctx.getContentResolver(); 
ContentValues values = new ContentValues(); 
String response = _getUrlResponse(url); 
cr.delete(tableName); 
values.put(parseString(response)); 
cr.insert(tableName, values); 

Y at-il une meilleure façon d'effectuer les opérations de db que l'aide d'un ContentResolver?

Le logcat est:

03-07 15:35:07.351: ERROR/AndroidRuntime(15826): java.lang.IllegalStateException: couldn't move cursor to position 17 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.CursorAdapter.getView(CursorAdapter.java:178) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.AbsListView.obtainView(AbsListView.java:1460) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.ListView.makeAndAddView(ListView.java:1809) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.ListView.fillUp(ListView.java:764) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.ListView.fillGap(ListView.java:710) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3421) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:2301) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.widget.ListView.onTouchEvent(ListView.java:3621) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.View.dispatchTouchEvent(View.java:3823) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1723) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1129) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1707) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.os.Looper.loop(Looper.java:123) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
03-07 15:35:07.351: ERROR/AndroidRuntime(15826):  at dalvik.system.NativeStart.main(Native Method) 
+0

pourrait être bon pour écrire le code du curseur de toute façon –

+0

je l'ai dit, les seules fonctions de CursorAdapter que je suis PRÉPONDÉRANTS sont NewView() et bindView(). Quant à la getCount() suggestion, je peux peut-être faire quelque chose comme ceci: '@Override publique Voir getView (int position, Vue convertView, parent ViewGroup) { \t \t try { \t \t \t super.getView retour (position, convertView, parent); \t \t} catch (RuntimeException e) { \t \t \t e.printStackTrace(); \t \t \t super.getCursor() .query(); \t \t \t return newView (parent.getContext(), super.getCursor(), parent); \t \t} \t} ' – JustinJ

Répondre

0

Êtes-vous peut-être pas mettre à jour votre valeur getCount() que les données de vos Cursor changements? On dirait qu'il essaie de passer à une rangée qui n'existe plus.

-1

J'ai eu un problème similaire. Je l'ai résolu par suppression une ligne que j'avais dans mon code:

mCursorAdapter.notifyDataSetChanged(); 
Questions connexes