我想 - 只是为了“概念证明” - 将整个查询结果集显示为字符串。我希望查询的表是一个变量。
怎么做到呢?我有以下开始:
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;
}
...但不知道如何从“<== now what?”开始。部分。
更新
基于格雷格的想法/代码,我将尝试这个:
// 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 (实数),3 == 字符串,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;
}