Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法在ListView中显示SQLite数据_Android_Sqlite_Listview - Fatal编程技术网

Android 无法在ListView中显示SQLite数据

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

我在src/main/assets中有一个名为books.sqlpro的数据库,其中包含id、title、author和body列

我想用数据库中的所有作者按字母顺序填充ListView

考虑到我没有指定我的数据库位置,它不起作用并不奇怪,但它给出的唯一错误是无法解析方法“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 Manager中创建数据库,并将其作为books.sqlpro复制到项目的资产文件夹中:-

对此,一个带有作者注释的列表视图为此劫持了另一个项目,因此其他列表:-