gyo2 Posté(e) 25 février 2011 Share Posté(e) 25 février 2011 Bonjour à tous, J’ai un petit problème pour retourner la liste de tables présentes dans ma bdd sqlite dans une listview. Je fais une requête sur la table sqlite_master (table invisible de sqlite) qui contient les infos sur les tables de ma bdd. Voici ma requete : public Cursor showTable(){ return myDataBase.rawQuery("select name from sqlite_master where type='table'", null); } Et le main: package com.formation.sql; import java.io.IOException; import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.database.SQLException; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class Main extends ListActivity implements OnClickListener { /** Called when the activity is first created. */ DataBaseHelper db; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getListView().setOnCreateContextMenuListener(this); ((Button)findViewById(android.R.id.button1)).setOnClickListener(this); db = new DataBaseHelper(this); try { db.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { db.openDataBase(); }catch(SQLException sqle){ throw sqle; } DataBind(); } @Override // Selection d'un item de la liste protected void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(this,Main2.class); this.startActivityForResult(intent, 1000); } @Override protected void onDestroy() { db.close(); super.onDestroy(); } public void DataBind(){ Cursor c = db.showTable(); startManagingCursor(c); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item,c,new String[]{"name"},new int[]{R.id.textTitre}); getListView().setAdapter(adapter); } public void onClick(View v) { Intent intent = new Intent(this,Main2.class); this.startActivityForResult(intent, 1000); Toast.makeText(this,"test bouton", Toast.LENGTH_SHORT).show(); } } L’appli plante lorsque j’exécute la requête, cependant si j’exécute une requête sur une autre table cela fonctionne. Je pense que le problème se situe sur la table sqlite_master, en particulier du fait que celle-ci ne contient pas de champ _id. Qu’en pensez vous ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 25 février 2011 Share Posté(e) 25 février 2011 Oui, un CursorAdapter a besoin d'une colonne nommée _id dans la réponse du Cursor, pour pouvoir fonctionner... Dans ton cas, tu peux contourner le problème en donnant un alias à la colonne retournée dans ta réponse public Cursor showTable(){ return myDataBase.rawQuery("select name as _id from sqlite_master where type='table'", null); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 25 février 2011 Auteur Share Posté(e) 25 février 2011 Oui, un CursorAdapter a besoin d'une colonne nommée _id dans la réponse du Cursor, pour pouvoir fonctionner... Dans ton cas, tu peux contourner le problème en donnant un alias à la colonne retournée dans ta réponse public Cursor showTable(){ return myDataBase.rawQuery("select name as _id from sqlite_master where type='table'", null); } Arf c'était évidant! mais fallait y penser. Merci ça fonctionne maintenant ;) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.