无法在ListView中显示SQLite数据

时间:2017-10-14 19:16:58

标签: android sqlite listview

我在books.sqlpro中有一个名为src/main/assets的数据库,其中包含idtitleauthorbody列。

我想按字母顺序在数据库中填写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);

    }

}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用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 复制到项目的assets文件夹中: -

enter image description here

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

enter image description here

相关问题