2011-08-08 14 views
20
public Cursor set_datetime_next(Reminder r) {  
    String _newVal = "datetime('now', '+7 days')"; 
    String[] args = { new Integer(r.getID()).toString() }; 
    String query = 
     "UPDATE " + DBConst.TABLE 
     + " SET " + DBConst.f_DATETIME_NEXT + "=" + _newVal 
     + " WHERE " + DBConst.f_ID +"=?"; 
    Log.i(TAG, query); 
    return db.rawQuery(query, args); 
} 

Próbowałem również przekazując datetime('now', '+7 days') jak oprawionego parametru, który nie będzie działać, jak Android documentation mówi:android.database.sqlite.SQLiteDatabase.rawQuery() nie jest aktualizowanie kolumny DATETIME z SQLite datetime() Funkcja

Wartości zostaną powiązane jako Ciągi.

Odniesienia:

+0

jest * _newval *: * datetime ('teraz', '+7 dni') * lub * "datetime ('teraz', ' +7 dni ")" *? –

+0

Witaj Guido, zaktualizowałem próbkę kodu, aby odpowiedzieć na twoje pytanie. –

Odpowiedz

54

kursor nie zamknięte.

public void set_datetime_next(Reminder r, String _newVal) {  
    String[] args = { new Integer(r.getID()).toString() }; 
    String query = 
     "UPDATE " + DBConst.TABLE 
     + " SET " + DBConst.f_DATETIME_NEXT + "=" + _newVal 
     + " WHERE " + DBConst.f_ID +"=?"; 
    Log.i(TAG, query); 
    Cursor cu = db.rawQuery(query, args); 
    cu.moveToFirst(); 
    cu.close();  
} 

Mimo że ma sens, co naprawdę mnie zastanawia jest wymóg nazywając moveToFirst() (lub jakaś inna funkcja, która „działa” z kursorem w jakiś sposób).
Bez wywołania obu moveToFirst() i close(), wiersz nigdy nie był aktualizowany. close() samodzielnie, po rawQuery(), nic nie zrobił.

+0

Zmieniłem kod powrotu, aby anulować, ponieważ rozmówca nie miał powodu do pracy z zestawem wyników, tak czy inaczej. –

+0

Niesamowite, uratowałeś mnie. Powinieneś zaakceptować własną odpowiedź. – orip

+3

dzięki, to był ratownik! Obsługa db na Androida jest naprawdę kiepsko zaimplementowana, jeśli pytasz mnie – slinden77

20

Ponieważ jest to instrukcja UPDATE, można użyć execSQL() zamiast rawQuery(). Nie musiałbyś zawracać sobie głowy kursorami (co jest dość głupie w przypadku stwierdzenia UPDATE).
Jednak trzeba podać wartości w instrukcji WHERE zamiast przekazywać argumenty, ponieważ execSQL() akceptuje tylko jeden argument String dla instrukcji SQL. Ponadto, execSQL() jest typu void.

używam execSQL() dla Niemalże wszystkie SQL, z wyjątkiem SELECT ...

+0

To powinna być akceptowana odpowiedź, bardziej intuicyjna niż rawQuery dla tej sprawy, zdecydowanie. –

Powiązane problemy