2011-08-08 10 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); 
} 

मैं भी एक बाध्य पैरामीटर के रूप में datetime('now', '+7 days') में गुजर की कोशिश की है, कि काम नहीं करेगा के साथ एक DATETIME स्तंभ को अद्यतन करने नहीं है Android documentation के रूप में कहते हैं:android.database.sqlite.SQLiteDatabase.rawQuery(), एक SQLite datetime() फ़ंक्शन

मूल्य स्ट्रिंग्स के रूप में बाध्य होंगे।

संदर्भ:

+0

है * _newval *: * दिनांक ('अब', '+7 दिनों') * या * "datetime ('अब', ' +7 दिन ') "*? –

+0

हाय गिडो, मैंने आपके प्रश्न का उत्तर देने के लिए कोड नमूना अपडेट किया है। –

उत्तर

54

कर्सर बंद नहीं किया गया था।

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

जबकि उस अर्थ, क्या वास्तव में पहेली मुझे moveToFirst() बुलाने की आवश्यकता (या कुछ अन्य समारोह जो किसी तरह से कर्सर "के साथ काम" होता है) है बनाता है।
moveToFirst() और close() दोनों के कॉल के बिना, पंक्ति को कभी अपडेट नहीं किया गया था। close()rawQuery() के बाद, कुछ भी नहीं किया।

+0

मैंने रिटर्न कोड को रद्द कर दिया है क्योंकि कॉलर के पास परिणाम सेट के साथ काम करने का कोई कारण नहीं था, वैसे भी। –

+0

बहुत बढ़िया, मुझे बचाया। आपको अपना जवाब स्वीकार करना चाहिए। – orip

+3

धन्यवाद, यह एक जीवन बचतकर्ता था! एंड्रॉइड पर डीबी हैंडलिंग वास्तव में लुभावनी है अगर आप मुझसे पूछें – slinden77

20

चूंकि यह UPDATE कथन है, तो आप के बजाय execSQL() का उपयोग कर सकते हैं। आपको कर्सर से परेशान नहीं होना पड़ेगा (जो UPDATE कथन के लिए थोड़े मूर्ख हैं)।
हालांकि, आपको कथन में गुजरने के बजाय मूल्यों को रखना होगा, क्योंकि execSQL() केवल आपके SQL कथन के लिए एक स्ट्रिंग तर्क स्वीकार करता है। इसके अलावा, execSQL() टाइप शून्य है।

मैं SELECT को छोड़कर सिर्फ SQL कथन के बारे में सभी के लिए execSQL() का उपयोग करें ...

+0

यह स्वीकार्य उत्तर होना चाहिए, इस मामले के लिए कच्चेQuery से अधिक सहज, दूर तक। –