不能在ListView中

不能在ListView中

问题描述:

显示的SQLite数据我有一个在src/main/assets称为books.sqlpro与列idtitleauthorbody数据库。不能在ListView中

我想按字母顺序与数据库中的所有作者一起填充ListView。

我并不感到惊讶它没有工作,因为我没有指定我的数据库位置,但它给出的唯一错误是Cannot resolve method 'getReadableDatabase()'

这里是我的代码:

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); 

    } 

} 

预先感谢您的帮助!

使用this.getReadableDatabase()会发现不起作用,因为它是您需要子类的SQLiteOpenHelper类的一种方法。

以下是获取作者列表的非常粗糙的方法。基本上它将资产文件中的数据库复制到标准数据库位置(如果它尚不存在)。获取所有行的游标,然后将它们显示在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); 

由此看来,SQLite的管理器中创建和复制到项目的资产文件夹books.sqlpro数据库: -

enter image description here

对此,与列表视图作者(注意劫持了另一个项目,因此其他名单): -

enter image description here