我试图检索一个列(保存名称的数据库列)并将它们放到列表视图中。我有一个名为Data with" getters"和" setters"。
以下代码放在扩展SQLiteOpenHelper
的DBHandler类中。此代码从MainActivity.java调用,其中listview旨在使用onClickButton
事件进行更新。
public String[] getNames (int a, int b) {
String[] names = new String[] {};
String selectQuery = "SELECT * FROM " + TABLE_NAME
+ " WHERE " + KEY_ONE + " = ? AND " + KEY_TWO + " = ?";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, new String[]{String.valueOf(a), String.valueOf(b)});
if (cursor.moveToFirst()) {
int i = 0;
do {
Data myData = new Data();
names [i] = cursor.getString(1); //Names in cursor
++i;
} while (cursor.moveToNext());
}
return names;
}
在MainActivity.java中,我在更新并通知listview适配器的更新之前调用以下代码:
values = db.getNames (1, 1);
我不知道为什么但这不起作用,当我点击按钮进入onClickButton时,它会抛出很多字符串长度的错误并使应用程序崩溃。
由于
答案 0 :(得分:1)
按照 laalto 回答,最后将ArrayList
转换为Array
,如下所示:
String[] arrRecords = names.toArray(new String[names.size()]);
答案 1 :(得分:0)
String[] names = new String[] {};
...
names [i] = cursor.getString(1); //Names in cursor
您正在分配一个导致ArrayIndexOutOfBoundsException
的空数组。
考虑使用ArrayList
之类的列表,您可以在其中附加您的值,例如
List<String> names = new ArrayList<String>();
...
names.add(cursor.getString(1));
如果您确实需要返回String[]
,则可以使用toArray()
转换列表:
String[] arr = new String[names.size()];
names.toArray(arr);
return arr;
此外,在发布涉及异常的问题时,请始终在问题本身中包含来自logcat的异常堆栈跟踪。
答案 2 :(得分:0)
为什么要这样使用
String[] names = new String[] {}; //no size
names [i] = cursor.getString(1); //it can work?
使用ArrayList<String>
List<String> names = new ArrayList<String>(); //declare
names.add(<column-val>); //add column value to list