2010-06-22 6 views
1

J'essaie de créer un adaptateur de liste qui s'insère et affiche les données d'une base de données. De ce que je peux dire, il tire l'information, mais il échoue quand j'essaye de créer le ListAdapter du nouvel adaptateur de curseur simple. Je ne sais pas ce que je fais mal ici.Mettre des données SQLite dans ListActivity

SQLiteDatabase db = myDbHelper.getReadableDatabase(); 
String select = "Select StateID, State, Details from States";    
Cursor cursor = db.rawQuery(select, null); 

startManagingCursor(cursor); 
ListAdapter adapter = new SimpleCursorAdapter(this, 
    android.R.layout.simple_list_item_1, 
    cursor, 
    new String[]{"State"}, 
    new int[]{android.R.id.text1}); 

setListAdapter(adapter); 

La deuxième partie sera de trouver comment assigner StateID comme id ligne dans la liste afin que je puisse y accéder quand quelqu'un clique sur un état, mais pour que ce n'est pas visible.

Répondre

4

Il est vraiment utile d'utiliser adb logcat, DDMS ou la perspective DDMS dans Eclipse pour voir la trace de la pile associée à un plantage. Sinon, nous n'avons aucune idée de ce que cela signifie quand vous dites que cela "échoue".

Cependant, il y a une faille majeure que je peux voir juste à partir d'une inspection de code: vous avez besoin d'une colonne nommée _ID pour pouvoir utiliser SimpleCursorAdapter. _ID doit être unique et Java long (INTEGER dans SQLite). En principe, vous remplacez StateID par _ID. Dans ce cas, votre "deuxième partie" est résolue, en ce que l'ID de la ligne est votre valeur _ID. Par exemple, lorsque vous obtenez un paramètre long id lors d'un clic sur un élément de liste, il s'agit de la valeur _ID.

+0

Je n'ai pas encore fait beaucoup de débogage dans Eclipse, encore en phase d'apprentissage. Dans le LogCat je trouve 06-22 21: 02: 22,519: ERREUR/AndroidRuntime (229): gestionnaire Uncaught: fil conducteur sortant en raison d'exception non interceptée 06-22 21: 02: 22,750: ERREUR/AndroidRuntime (229): java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo {com.jl.og/com.jl.og.Informational}: java.lang.IllegalArgumentException: la colonne '_id' n'existe pas – AndyD273

+0

J'ai donc renommé StateID en _id, et cela semblait le faire. Ce qui est vraiment frustrant. Ce n'est pas _ID, ça doit être _id. J'ai aussi 8 tables, que je rejoins ensemble, et avoir _id comme clé primaire sur toutes les tables est un peu ennuyeux, car elles ne correspondent pas aux clés étrangères maintenant, ce qui rend les choses maladroites. De plus j'utilise cette base de données dans plusieurs applications, ce qui signifie que je dois soit les réécrire pour utiliser la nouvelle structure, soit je dois renommer les colonnes d'ID chaque fois que je fais une mise à jour ... Un moyen de contourner cela? – AndyD273

+0

Est-il possible de simplement mettre 'Select StateID comme _id'? – AndyD273

0

Tout est bon pour moi.

Si vous devez obtenir l'identifiant de ligne, vous devez avoir une colonne _ID dans les résultats de votre requête, qui sera reconnue comme identifiant de ligne.

Questions connexes