填写数据库数据列表

时间:2018-12-03 18:55:40

标签: android sqlite

请帮我弄清楚为什么这些代码行不起作用。 我想用从数据库中提取的String元素填充列表。

这是返回列表的方法fillTheList():

public List<String> fillTheList() {
    List<String> list = new ArrayList<String>();

//My database is called "ITEMS_" and the first column is called "typeOfItem"
    String[] column = {"typeOfItem"};
    String selection = "SELECT DISTINCT type FROM ITEMS_";

    Cursor cursor = MainActivity.sqLiteHelper.getDataCategories("ITEMS_", column, selection);

    if(cursor != null) {
        list.clear();

        if (cursor.moveToFirst()) {
            do {
                String type = cursor.getString(1);

                list.add(type);
            } while (cursor.moveToNext());
        }
    }
    Log.d("List", cursor.getString(1));
    return list;
}

getDataCategories()是sqLiteHelper类的方法

public Cursor getDataCategories(String table, String[] columns, String selection )
{
    SQLiteDatabase database = getReadableDatabase();
    Cursor cursor = database.query(true, table, new String[] {String.valueOf(columns)}, selection,
            null, null, null, null, null);
    return cursor;
}

错误发生在:     游标游标= MainActivity.sqLiteHelper.getDataCategories(“ ITEMS_”,列,选择);而logcat是:      “由于:java.lang.NullPointerException:尝试在空对象上调用虚拟方法'android.database.Cursor SQLiteHelper.getDataCategories(java.lang.String,java.lang.String [],java.lang.String)'参考”

1 个答案:

答案 0 :(得分:0)

错误日志指示MainActivity.sqLiteHelpernull
我不知道您在fillTheList()的哪个班级,但是您遇到了以错误的方式填写列表的问题。
像这样更改fillTheList()

public List<String> fillTheList() {
    List<String> list = new ArrayList<>();
    Cursor cursor = sqLiteHelper.getDataCategories();
    if(cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                list.add(cursor.getString(0));
            } while (cursor.moveToNext());
        }
    }
    return list;
}

如您所见,您必须提供一个上下文以初始化SQLiteHelper,以获取游标并填充列表。
然后将getDataCategories()更改为此:

public Cursor getDataCategories() {
    SQLiteDatabase database = getReadableDatabase();
    return database.rawQuery("SELECT DISTINCT typeOfItem FROM ITEMS_", null);
}

此方法使用更简单的rawQuery()而不是query()
我不知道该列的名称是typeOfItem还是type,因此是否需要更改sql语句。
现在,如果首先有一个有效的fillTheList()对象,例如SQLiteOpenHelper,则可以使用sqlObject,例如:

List<String> list = sqlObject.fillList();