Android 无法在ListView中显示SQLite数据
我在src/main/assets中有一个名为books.sqlpro的数据库,其中包含id、title、author和body列 我想用数据库中的所有作者按字母顺序填充ListView 考虑到我没有指定我的数据库位置,它不起作用并不奇怪,但它给出的唯一错误是无法解析方法“getReadableDatabase” 这是我的密码:Android 无法在ListView中显示SQLite数据,android,sqlite,listview,Android,Sqlite,Listview,我在src/main/assets中有一个名为books.sqlpro的数据库,其中包含id、title、author和body列 我想用数据库中的所有作者按字母顺序填充ListView 考虑到我没有指定我的数据库位置,它不起作用并不奇怪,但它给出的唯一错误是无法解析方法“getReadableDatabase” 这是我的密码: package com.example.apple.bookshelf; import android.database.Cursor; import android
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 Manager中创建数据库,并将其作为books.sqlpro复制到项目的资产文件夹中:-
对此,一个带有作者注释的列表视图为此劫持了另一个项目,因此其他列表:-