不能在ListView中
问题描述:
显示的SQLite数据我有一个在src/main/assets
称为books.sqlpro
与列id
,title
,author
和body
数据库。不能在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数据库: -
对此,与列表视图作者(注意劫持了另一个项目,因此其他名单): -