Aller au contenu

liste des tables sqlite


Recommended Posts

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...