从7列表中的2列中获取非空值

时间:2014-12-27 20:42:16

标签: android sqlite android-sqlite

我有一个SQLite表,如:

Table

每行代表一个对象,列B-G代表对象持有的数据。如您所见,只有列B和C被保证为非空。

我想要做的是以先进先出的方法从E列和F列获取所有非空数据(如果E和F都有非空值,我们只需要E第一)。我想取非空值并将它们添加到ArrayList<String>对象,然后返回数组。因此,对于上表,我的ArrayList看起来像[String1, String2, String3, String4]

以下是我到目前为止的情况,但我的程序崩溃了。我认为由于某种原因,返回的数组为空。

更新:下面的rawQuery不起作用。当列E为非null且列F为null时,将返回类似于:[String, null]的数组。这是通过以后获取数组的大小来验证的,该大小为2,然后尝试在try/catch中遍历它。第一个元素运行正常,但第二个元素抛出NullPointerException

db = dbHelper.getReadableDatabase();

ArrayList<String> array= new ArrayList<String>();

Cursor cursor = db.rawQuery("SELECT " + COLUMN_E + ", " + COLUMN_F + " FROM " 
                            + MY_TABLE + " WHERE " + COLUMN_E + " IS NOT NULL OR "
                            + COLUMN_F + " IS NOT NULL", null);

if (cursor.getCount() > 0)
{
    cursor.moveToFirst();

    do
    {
        array.add(cursor.getString(cursor.getColumnIndex(COLUMN_E)));
        array.add(cursor.getString(cursor.getColumnIndex(COLUMN_F)));
    } while (cursor.moveToNext());

    cursor.close();
}

return array;

任何人都可以帮帮我吗?谢谢!

当E不为空时,Logcat为空,F为空。当F为非null且E为null时,以及当两者都为非null时,也会发生相同的情况。当我尝试将ArrayList转换为String数组时,另一个类发生异常:

java.lang.NullPointerException: Attempt to get length of null array

2 个答案:

答案 0 :(得分:1)

在将列插入arraylist之前,测试返回的列是否为null。有一个isNull()方法来检测空值。

答案 1 :(得分:1)

使用UNION子句加入来自2个查询的结果:

Cursor cursor = db.rawQuery
    (
        "SELECT " + COLUMN_E + " AS myField FROM " + MY_TABLE + " WHERE " + COLUMN_E + " IS NOT NULL " + 
        "UNION " + 
        "SELECT " + COLUMN_F + " AS myField FROM " + MY_TABLE + " WHERE " + COLUMN_F + " IS NOT NULL ", null
    );

因此,您将获得包含名为myField的字段的单个列结果集,该字段从Column_E AND 收集Column_F中的非空值的非空值。