2010-12-09 5 views
3

J'ai un peu de difficulté à comprendre les concepts de fonctionnement des bases de données SQLite dans android. J'ai créé une classe DatabaseHelper.java qui est la suivante:Base de données SQLite dans android et java

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "library.db"; 
    public static final String TITLE = "title"; 
    public static final String MUSICTITLE = "musictitle"; 
    public static final String AUTHOR = "author"; 
    public static final String ARTIST = "artist"; 


    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE music (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, artist TEXT);"); 
     db.execSQL("CREATE TABLE books (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT);"); 
     db.execSQL("CREATE TABLE movies (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     android.util.Log.v("Constants", 
       "Upgrading database which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS books"); 
     db.execSQL("DROP TABLE IF EXISTS music"); 
     db.execSQL("DROP TABLE IF EXISTS movies"); 
     onCreate(db); 
    } 

} 

Pour autant que je suis conscient que ceci fonctionne et a été vérifiée à l'aide de la console adb.

Ma question est comment puis-je interroger cette base de données au sein de l'application à partir d'une activité différente, par exemple je veux dans mon application pour interroger la base de données: SELECT titre FROM books; qui me retournera les titres de la table du livre, comment puis-je me connecter à la base de données, exécuter cette requête puis stocker tous les résultats dans un tableau?

---------------------------------- Modifier ----------- -----------------------------

Droit donc dans la partie où je veux interroger j'ai placé ce code:

if (category.equals("Books")){ 
      img.setImageResource(R.drawable.book); 
      ArrayList<String> list = new ArrayList<String>(); 
      dh = new DatabaseHelper(this); 
      SQLiteDatabase db = dh.getReadableDatabase(); 
      Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc"); 
      if (cursor.moveToFirst()) { 
       do { 
        list.add(cursor.getString(1)); 
       } while (cursor.moveToNext()); 
      } 
      if (cursor != null && !cursor.isClosed()) { 
       cursor.close(); 
      } 
      list.add("Test"); 
      cont_array = (String[]) list.toArray(); 
      db.close(); 
     } 

Qui passe la catégorie en bas de l'activité précédente. De la réponse d'Olivier. Ce code bloque l'application et je n'ai aucune idée pourquoi. la variable cont_array est utilisée après cette instruction if pour remplir un ListView. Quelqu'un at-il des idées où je me trompe, il n'y a rien dans LogCat pour me dire où il échoue?

Répondre

3

l'intérieur de votre activité, procédez comme suit:

public class DBAct extends Activity { 
    private DataHelper dh; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //init your activity here 
     //e.g. setContentView(R.layout.main); 

     dh = new DataHelper(this); 
     SQLiteDatabase db = dh.getReadableDatabase(); 
     Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc"); 
     if (cursor.moveToFirst()) { 
      do { 
       list.add(cursor.getString(0)); 
      } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
      cursor.close(); 
     } 
     db.close(); 
    } 
} 
+0

Edited ma question après avoir utilisé votre code et toujours avoir des erreurs. – SamRowley

+0

Sans le message d'erreur concret, c'est difficile à dire. Mais il y a un piège commun dans votre code. Essayez d'utiliser 'cont_array = (Chaîne []) list.toArray (nouvelle chaîne [list.size()])' –

+0

Je finis kI ont résolu ce problème, mais la récupération des données ne semble pas apporter quelque chose en retour , donc list.add (cursor.getString (0)); ne semble pas faire quoi que ce soit. J'ai testé cela en utilisant un TextView et en mettant le résultat dans cette vue de texte mais il retourne false. – SamRowley

3

Pour lire et écrire dans la base de données, vous devez d'abord saisir une instance d'un objet SQLiteDatabase dans l'un de vos Activity s. En utilisant votre classe DatabaseHelper, vous pouvez le faire en appelant le databaseHelper.getReadableDatabase() ou le databaseHelper.getWritableDatabase() en fonction de ce que vous devez faire (lire/écrire).

Une fois que vous avez une instance de SQLiteDatabase, vous pouvez utiliser ses diverses méthodes d'assistance pour effectuer des opérations CRUD. Par exemple, pour exécuter la requête SELECT title FROM books, vous pouvez utiliser l'une des différentes méthodes query(). Il existe également des méthodes insert(), update() et delete() disponibles. Ces méthodes renvoient parfois un Cursor, qui peut ensuite être utilisé dans des objets tels que ListView pour parcourir un ensemble de résultats à partir de la base de données. Je vous recommande d'utiliser un Cursor plutôt que de bourrer des résultats dans un tableau si possible, simplement parce qu'il y a une quantité décente de méthodes et d'objets qui jouent bien avec les curseurs.

Note: Assurez-vous de fermer une instance de SQLiteDatabase une fois que vous avez terminé votre lecture/écriture pour éviter tout problème avec les fuites de ressources.

Si vous avez besoin de plus d'informations, je recommande de lire les spécificités de chaque classe dans le API Documentation.

1

s'il vous plaît vérifier mon post sur SQLite http://android-pro.blogspot.com/2010/10/using-sqlite-database-with-android.html

il est un exemple d'application, vous pouvez downlaod et vérifier les choses que vous voulez

+8

S'il vous plaît ne publiez pas de liens au lieu de réponses. Poster la réponse à la place, et si elle a besoin de plus d'explications, le lien. De cette façon, si le lien tombe en panne, la réponse sera toujours disponible. –

+1

J'ai posté le lien pour éviter d'écrire une grande quantité de texte –

+2

Désolé, je ne suis pas d'accord avec vous Valentin. À mon avis, le lien semble très utile et il est également un peu difficile d'afficher du texte bien formaté ici. – saxos

Questions connexes