Инструкция SQLite в Android Studio 3.5.3 - PullRequest
0 голосов
/ 10 января 2020

Я новичок ie со Android Studio, поэтому, пожалуйста, будьте терпеливы ... Этот форум часто приводит меня с предложениями и примерами (в качестве читателя), но сегодня я решил обратиться за помощью:

Поскольку часы, я пытаюсь построить оператор SQLite в Android Studio: есть столбец COLUMN_LAST_ATTEMPT с датой и временем в виде строки, например 2020-01-09 17:23, см. Скриншот, и я хочу получить самую новую дату ( без времени) из таблицы, например 2020-09-01. Я пробовал различные варианты, но не могу запустить его.

Мне нужен Android оператор SQLite для

SELECT MAX(SUBSTR(last_attempt,11,20)) FROM quiz_questions

(который работает на DBBrowser), где 'last попытка »- это столбец таблицы« quiz_questions », снимок экрана этого столбца в таблице« quiz_questions »

Я пробовал следующие rawQueries, ни один из них работает:

в классе QuizDBHelper

    //...
    final QuizDbHelper dbHelper = QuizDbHelper.getInstance(this);
    //...

    public String newestQuiz(){
    db = getReadableDatabase();
    String result = null;

    Cursor cursor = db.rawQuery("SELECT MAX(" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT + ") FROM "
            + QuizContract.QuestionsTable.TABLE_NAME, null);

    //Cursor cursor = db.rawQuery("SELECT MAX(SUBSTR(" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT +
    // ",11,20)) FROM " + QuizContract.QuestionsTable.TABLE_NAME, null);

    //Cursor cursor = db.rawQuery("SELECT " + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT + " FROM " +
    // QuizContract.QuestionsTable.TABLE_NAME, null);

    if(cursor.moveToFirst()){
        do {
            result = cursor.getString(c.getColumnIndex(QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT));
        } while (cursor.moveToNext());
    }
    cursor.close();
    return result;
}

в классе статистики

    String LastUse = dbHelper.newestQuiz();
    LastUsage.setText("Letzte Challenge: " + LastUse);

    //LastUsage is a TextView in activity_Statistics.xml
    //attached with LastUsage = findViewById(R.id.text_lastUsage);

Либо операторы SQLite полностью неверны, либо я делаю (основа c? ) ошибки в классе статистики. Мне нужна ... newb ie помощь!

Мне нужно что-то вроде Select column from table where substring of date-Entry == newest

1 Ответ

0 голосов
/ 10 января 2020

Ваша проблема, кажется, имена столбцов. То есть курсор содержит только извлеченные столбцы, а не все столбцы таблицы. Хотя вы основываете свой запрос на столбце согласно QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT, это не будет имя столбца в курсоре.

Скорее это будет MAX(SUBSTR(" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT + // ",11,20))

Самый простой способ управления этим присвоить столбцу в курсоре заданное имя c, используя AS . Как таковое, возможно, используйте: -

Cursor cursor = db.rawQuery("SELECT MAX(" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT + ") AS " + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT  + " FROM "
            + QuizContract.QuestionsTable.TABLE_NAME, null);

Тем не менее, вы можете использовать имя столбца (AS ????) с указанием c для ситуации, например

........ AS max_" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT  + ........

You тогда придется использовать: -

result = cursor.getString(c.getColumnIndex("max_" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT));

В качестве альтернативы, так как это всего лишь одно значение / столбец, который возвращается в курсоре, вы можете использовать смещение столбца, равное 0, и в этом случае имя столбца не имеет значения, как Пока это действительно. Однако использование смещений обычно не рекомендуется из-за отсутствия проверки доступа к столбцу.

Комментарий: -

Мне просто нужна часть даты

Поскольку дата является распознанным форматом DateTime (а также то, что такие форматы можно сортировать / сортировать напрямую), используйте max (date (column_name)) или даже max (column_name).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...