Есть ли способ спрятать весь результат запроса SQLite в строку?

Я хочу - только для "доказательства концепции" - отобразить весь набор результатов запроса в виде строки. И я хочу, чтобы запрашиваемая таблица была переменной.

Как это сделать? У меня есть следующее начало:

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;
}

person B. Clay Shannon    schedule 22.04.2014    source источник


Ответы (1)


Возможно, вам лучше использовать класс StringBuilder, подобный этому (обратите внимание, что это дает вам одну огромную строку, а не массив строк; если вам нужен массив, в котором каждая строка курсора является его собственным элементом, затем объявите результаты как ArrayList, замените results.append с results.add и return results.toArray().

public String 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 null }

    cursor.moveToFirst();
    while (true) {
        results.append(cursor.getString(0));  // this assumes only one column in the results
        if (cursor.isLast()) break;
        cursor.moveToNext();
    }
    cursor.close();

    if (db != null) {
        db.close();
    }
    return results.toString();
}
person Greg    schedule 22.04.2014
comment
Это выглядит многообещающе; однако есть ли способ получить все столбцы (никогда не бывает только один). - person B. Clay Shannon; 23.04.2014
comment
cursor.getColumnCount() вернет общее количество столбцов. Затем вы можете взаимодействовать с ними как с внутренним циклом прямо под while (true) (переместить results.append в этот новый внутренний цикл) - person Greg; 23.04.2014
comment
Это делает меня на шаг ближе, но есть ли способ опросить это, чтобы я мог узнать, какой тип данных получить (string, int и т. д.)? - person B. Clay Shannon; 24.04.2014
comment
Обычно вы знаете структуру/схему базы данных, которая, конечно же, сообщает вам типы для каждого столбца. Теоретически вы можете просто жестко закодировать эти знания в своей программе. Если вы выполняете это относительно вслепую в базах данных, о которых вы не знали заранее, вы, вероятно, застряли, добавляя метод, который сначала выполняет необработанный запрос для описания рассматриваемой таблицы, а затем анализирует результат, чтобы получить тип данных для каждого столбца. Было бы лучше использовать стандартный метод cursor.query(), в котором вы явно определяете нужные столбцы. - person Greg; 24.04.2014
comment
Кажется, это работает так же, как у меня выше - просто получить все vals как строку, а затем добавить к ней иногда избыточный .toString(). Вроде работает, говорю, так как колонка _id(int) работала нормально. Мой комментарий в обновлении показывает, что я думаю о джазе getType так же, как и вы, но это не кажется необходимым. - person B. Clay Shannon; 24.04.2014
comment
Однако я сделал его более элегантным (обновление 3). - person B. Clay Shannon; 24.04.2014
comment
согласованный! Похоже, у тебя все под контролем. Рад, что смог помочь! - person Greg; 24.04.2014