【问题标题】:Can't show SQLite data in ListView无法在 ListView 中显示 SQLite 数据
【发布时间】:2017-10-14 19:16:57
【问题描述】:

我在src/main/assets 中有一个名为books.sqlpro 的数据库,其中包含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);

    }

}

提前感谢您的帮助!

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    使用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 文件夹中:-

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多