2017-10-14 6 views
-1

J'ai une base de données appelée books.sqlpro en src/main/assets avec des colonnes id, title, author et body.Ne peut pas afficher les données SQLite dans ListView

Je voudrais remplir un ListView avec tous les auteurs dans la base de données dans l'ordre alphabétique.

Je ne suis pas surpris que cela ne fonctionne pas, car je n'ai pas spécifié l'emplacement de ma base de données, mais la seule erreur qu'il donne est Cannot resolve method 'getReadableDatabase()'.

Voici mon code:

package com.example.apple.bookshelf; 

import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class MainActivity extends AppCompatActivity { 

    private ListView mainListView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mainListView = (ListView) findViewById(R.id.mainListView); 

     String Table_Name = "books"; 
     String selectQuery = "SELECT * FROM " + Table_Name; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     cursor.moveToFirst(); 
     String[] NameArray = new String[cursor.count()]; 

     ArrayAdapter<String> arrayAdapter = 
       new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, NameArray); 

     mainListView.setAdapter(arrayAdapter); 

    } 

} 

Merci d'avance pour votre aide!

Répondre

0

L'utilisation de this.getReadableDatabase() va, comme vous ne l'avez pas trouvé car c'est une méthode de la classe SQLiteOpenHelper dont vous auriez besoin d'une sous-classe.

Voici une manière très grossière d'obtenir votre liste d'auteurs. Fondamentalement, il copie la base de données dans le fichier d'actifs à l'emplacement de base de données standard (s'il n'existe pas déjà). Obtient un curseur pour toutes les lignes et les affiche ensuite dans ListView.

final String DBNAME = "books.sqlpro"; 
    final String DBPATH = this.getDatabasePath(DBNAME).getPath(); 
    final String TBNAME = "books"; 
    final String AUTHOR_COL = "author"; 
    String outfilename = DBPATH + DBNAME; 
    SQLiteDatabase booksdb; 

    try { 
     booksdb = SQLiteDatabase.openDatabase(outfilename, 
      null, 
      SQLiteDatabase.OPEN_READONLY 
     ); 
    } catch (Exception e) { 
     try { 
      InputStream is = this.getAssets().open(DBNAME); 
      OutputStream os = new FileOutputStream(outfilename); 

      byte[] buffer = new byte[32768]; 
      int length; 
      while ((length = is.read(buffer)) > 0) { 
       os.write(buffer); 
      } 
      is.close(); 
      os.flush(); 
      os.close(); 

     } catch (IOException io) { 
      io.printStackTrace(); 
     } 
     try { 
      booksdb = SQLiteDatabase.openDatabase(outfilename, 
       null, 
       SQLiteDatabase.OPEN_READONLY 
      ); 
     } catch (Exception e2) { 
      e2.printStackTrace(); 
     } 
    } 
    Cursor csr = booksdb.query(TBNAME,null,null,null,null,null,null); 
    String[] authorlist = new String[csr.getCount()]; 
    while (csr.moveToNext()) { 
     authorlist[csr.getPosition()] = csr.getString(csr.getColumnIndex(AUTHOR_COL)); 
    } 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, 
     authorlist 
    ); 
    mListView1.setAdapter(adapter); 

De là, la base de données créée dans SQLite Manager et copiés dans le dossier actif du projet books.sqlpro: -

enter image description here

Pour cela, une vue de liste avec la auteurs (note détourné un autre projet pour cela, d'où les autres listes): -

enter image description here