SQLite Abfrage fehlerhaft - komme nicht weiter - please help.

jojava

Neues Mitglied
Kann mir jemanden helfen?
Die Methode getMonthlyCounter mit der SQL Abfrage funktioniert nicht und gibt immer 0 zurück.
Die Abfrage für getDailyCounter funktioniert.
Debuggen zeigt aber, dass der cursor etwas ausliest aber anscheinend immer 0 obwohl in der Datenbank unter dem Monat Oktober mehrere Einträge vorhanden sind. Hat jemand einen Tipp wo der Fehler liegen könnte? ( IDE Android Studio )

Java:
public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "counter_db";
    private static final String TABLE_NAME = "counters";
    private static final String COL_DATE = "date";
    private static final String COL_DAILY_COUNTER = "daily_counter";

    private SQLiteDatabase db;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        db = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + COL_DATE + " TEXT PRIMARY KEY," + COL_DAILY_COUNTER + " INTEGER)");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);

    }

    public int getDailyCounter() {
        String currentDate = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()).format(new Date());
        Cursor cursor = db.rawQuery("SELECT " + COL_DAILY_COUNTER + " FROM " + TABLE_NAME + " WHERE " + COL_DATE + "=?", new String[]{currentDate});

        if (cursor.moveToFirst()) {
            return cursor.getInt(cursor.getColumnIndex(COL_DAILY_COUNTER));
        } else {
            return 0;
        }
    }

    public int getMonthlyCounter() {
        String currentMonth = new SimpleDateFormat("yyyyMM", Locale.getDefault()).format(new Date());

        String query = "SELECT SUM(" + COL_DAILY_COUNTER + ") AS MonthlyCounter FROM " + TABLE_NAME + " WHERE strftime('%Y%m', " + COL_DATE + ") = ?";
        Cursor cursor = db.rawQuery(query, new String[]{currentMonth});
      
        if (cursor.moveToFirst()) {
            return cursor.getInt(cursor.getColumnIndex("MonthlyCounter"));
        } else {
            return 0;

        }
 
Ich würde es so probieren. Wobei 'date' als Spaltenname vermutlich eher ungünstig ist, wahrscheinlich ist das ein reserviertes Wort.
SQL:
String[] selectionArgs = new String[] { String.valueOf(year), String.valueOf(month) };
String sql = "SELECT sum(coalesce(daily_counter, 0)) FROM counters WHERE "+
             "strftime('%Y', date) = ? AND strftime('%m', date) + 0 = ? + 0";
Cursor c = db.rawQuery(sql, selectionArgs);
Absolut ungetestet!
 
... obwohl, wenn ich mir die Tabelle anschaue:
SQL:
CREATE TABLE counters (date TEXT PRIMARY KEY, daily_counter INTEGER)
Dann ist die Spalte 'date' überhaupt kein Datum/Zeit sondern 'TEXT', also funktioniert da 'strftime' vermutlich überhaupt nicht. Das hatte ich beim ersten mal übersehen (so lässt man sich täuschen - von dem Spaltennamen). Textvergleiche kann man einfach mit 'like' machen.
SQL:
SELECT * FROM counters WHERE date LIKE '202310%'
oder
SQL:
SELECT * FROM counters WHERE date LIKE '202310__'
 

Zurück
Oben