Я хочу - только для "доказательства концепции" - отобразить весь набор результатов запроса в виде строки. И я хочу, чтобы запрашиваемая таблица была переменной.
Как это сделать? У меня есть следующее начало:
public String[] getAllRecordsFrom(String tblName) {
String query = "Select * FROM " + tblName;
String[] results = null;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db != null ? db.rawQuery(query, null) : null;
if (cursor == null) return results;
while (cursor.moveToFirst()) {
results. <== now what?
}
cursor.close();
if (db != null) {
db.close();
}
return results;
}
...но не знаю, как перейти от "‹== что теперь?" часть.
ОБНОВИТЬ
Основываясь на идеях/коде Грега, я собираюсь попробовать следующее:
// Generic * query
public StringBuilder getAllRecordsFrom(String tblName) {
String query = "Select * FROM " + tblName;
StringBuilder results = new StringBuilder();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db != null ? db.rawQuery(query, null) : null;
if (cursor == null) return results;
int colCount = cursor.getColumnCount();
cursor.moveToFirst();
while (true) {
for (int i = 0; i < colCount; i++) {
results.append(cursor.getString(i).toString());
// if the above (getting all data types as string) doesn't work, see if this (pseudocode) will: Type t = results.append(cursor.getType(i); if t == int then getint(i), else if t == string then getString(i), &c.
}
if (cursor.isLast()) break;
cursor.moveToNext();
}
cursor.close();
if (db != null) {
db.close();
}
return results;
}
ОБНОВЛЕНИЕ 2
Хорошо, это сработало вместе с этим:
private class ShowLocalDataTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... strings) {
String tbl = strings[0];
SQLiteOpenHelperHHS sqliteHHS = new SQLiteOpenHelperHHS(SQLiteActivity.this, null);
StringBuilder sb = sqliteHHS.getAllRecordsFrom(tbl);
return sb.toString();
}
@Override
protected void onPostExecute(String result) {
EditText etmultiline = (EditText) findViewById(R.id.editTextMultiline);
if (result == null) return;
etmultiline.setText(result);
Log.i("QueryResults", result);
}
}
Примечание. Если ".toString() не сработало, предположительно я мог бы использовать «cursor.getType(i)». Возвращаемые значения getType: 0 == null, 1 == int, 2 == float (REAL), 3 == String, 4 == BLOb
ОБНОВЛЕНИЕ 3
Я думаю, что это немного более "элегантно" (получая столбцы как их типы):
public StringBuilder getAllRecordsFrom(String tblName) {
final int NULLVAL = 0;
final int INTVAL = 1;
final int FLOATVAL = 2;
final int STRINGVAL = 3;
final int BLOBVAL = 4;
String query = "Select * FROM " + tblName;
StringBuilder results = new StringBuilder();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db != null ? db.rawQuery(query, null) : null;
if (cursor == null) return results;
int colCount = cursor.getColumnCount();
cursor.moveToFirst();
int typeVal;
while (true) {
for (int i = 0; i < colCount; i++) {
typeVal = cursor.getType(i);
switch (typeVal) {
case NULLVAL:
// nuttin', honey
break;
case INTVAL:
results.append(cursor.getInt(i)).toString();
break;
case FLOATVAL:
results.append(cursor.getFloat(i)).toString();
break;
case STRINGVAL:
results.append(cursor.getString(i));
break;
case BLOBVAL:
//results.append(cursor.getBlob(i)).toString();
// Probably better off doing it this way:
results.append("BLOb" + String.valueOf(i));
break;
}
}
if (cursor.isLast()) break;
cursor.moveToNext();
}
cursor.close();
if (db != null) {
db.close();
}
return results;
}