簡體   English   中英

Android Studio 3.5.3 中的 SQLite 語句

[英]SQLite Statement in Android Studio 3.5.3

我是 Android Studio 的新手,所以請耐心等待……這個論壇經常給我提供建議和示例(作為讀者),但今天我決定尋求幫助:

從幾小時開始,我嘗試在 Android Studio 中構建 SQLite 語句:有一列COLUMN_LAST_ATTEMPT將日期和時間作為字符串,例如2020-01-09 17:23 ,請參閱屏幕截圖,我想獲取最新日期(沒有時間) 來自表,例如2020-09-01 我嘗試了各種選項,但無法運行。

我需要的是一個 Android SQLite 語句

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

(在 DBBrowser 上運行),其中“最后一次嘗試”是“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 語句要么完全錯誤,要么我在統計課上犯了(基本的?)錯誤。 我需要...新手幫助!

我需要類似Select column from table where substring of date-Entry == newest

您的問題似乎是列名。 那是一個 Cursor 只包含提取的列,而不是表中的所有列。 盡管您根據QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT將查詢基於列, QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT不會是游標中的列名。

相反,它將MAX(SUBSTR(" + QuizContract.QuestionsTable.COLUMN_LAST_ATTEMPT + // ",11,20))

最簡單的管理方法是使用AS為 Cursor 中的列指定一個特定名稱。 因此,也許使用:-

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

但是,您可能更喜歡使用特定於情況的列名(AS ????),例如

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

然后你將不得不使用:-

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

或者,由於它只是在游標中返回的單個值/列,因此您可以使用列偏移量 0,在這種情況下,只要有效,列名就無關緊要。 但是,由於缺乏對正在訪問的列的驗證,通常不建議使用偏移量。

重新評論:-

我只需要日期部分

由於日期是公認的日期時間格式(並且此類格式可直接排序/排序),因此請使用 max(date(column_name)) 甚至 max(column_name)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM