我有一个SQLite表,如:
每行代表一个对象,列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
答案 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中的非空值的非空值。