2011-09-19 16 views
6

मुझे rawQuery विधि का उपयोग करके एक रिकॉर्ड स्टोर करने की आवश्यकता है, क्योंकि मैं वर्तमान दिनांक और समय (datetime()) डालना चाहता हूं, लेकिन मुझे स्ट्रिंग्स को स्ट्रिंग्स डालने की भी आवश्यकता है।रिकॉर्ड रिकॉर्ड करने के लिए rawQuery का उपयोग कैसे करें

String sql="INSERT INTO sms VALUES (null, ?1, ?2, ?3, datetime())"; 
dbw.rawQuery(sql, new String[]{str1,str2,str3}); 

लेकिन यह कुछ भी दुकान नहीं है ... क्या गलत है:

तो मैं इस कोड लिखा?

[संपादित करें]

इस तरह से मैं त्रुटियों नहीं मिलता है में, लेकिन रिकॉर्ड नहीं डाला गया है।

String mitt="mitt", dest="dest", text="text"; 
String sql="INSERT INTO sms VALUES (null, ?, ?, ?, datetime('NOW'))"; 
dbw.rawQuery(sql, new String[]{mitt,dest,text}); 

इस समय, एक ही तरीका है कि (उद्धरण समस्या के साथ) एक रिकॉर्ड डालने के लिए काम करता है execSQL(String s) है।

उत्तर

15

SQLite में मूल डेटाटाइम डेटा संग्रहण प्रकार नहीं है। यह एक स्ट्रिंग या इसके बजाय एक तिथि का एक पूर्णांक प्रतिनिधित्व स्टोर कर सकते हैं।

अपने मूल्यों को बदलने के लिए आप दिनांक समय कार्यों Sqlite Date and Time functions documentation

आपका प्रारंभिक प्रयास में विस्तृत उपयोग कर सकते हैं लगभग सही है, लेकिन अपने datetime() फ़ंक्शन कॉल 'NOW' की एक बहस की आवश्यकता है।

String sql="INSERT INTO sms VALUES (null, ?, ?, ?, datetime('NOW'))"; 

इसके अलावा, आप rawQuery के बजाय execSQL जो एक recordset वापस जाने के लिए उम्मीद कर रही है फोन करना चाहिए।

dbw.execSQL(sql, new String[]{str1,str2,str3}); 

आप आलो अपने प्रश्न में तालिका नाम के बाद एक क्षेत्र सूची डालने अगर सभी मूल्यों

String sql = "INSERT INTO sms(f1, f2, f3, f4)" 
      + "VALUES (null, ?, ?, ?, datetime('NOW'))"; 

एक अन्य विकल्प है कि संभव हो सकता है using a default timestamp in SQLite है डालने नहीं द्वारा में अलग-अलग स्तंभों डेटा डालने के लिए निर्दिष्ट कर सकते हैं , हालांकि मैंने एंड्रॉइड में इसका प्रयास नहीं किया है।

+0

मैंने प्रश्न – supergiox

+0

संपादित किया है क्या यह संभव है कि rawQuery INSERT के साथ काम न करे? प्रलेखन इसके बारे में कुछ भी नहीं कहता है – supergiox

+0

कुछ भी नहीं ... यह वह तरीका है जो काम करता है (उद्धरण के लिए स्वीकार्य): 'स्ट्रिंग एसक्यूएल =" एसएमएस मूल्यों में निहित करें (शून्य, '"+ मिट +",' "+ dest +" ',' "+ टेक्स्ट +" ', डेटाटाइम (' अब ')) "; dbw.execSQL (sql); ' – supergiox

-2

इस तरह यह प्रयास करें:

ContentValues values; 
values=new ContentValues(); 

// values.put("field_name",value); 
values.put("id", 5); 
values.put("name", name); 
dbw.insert("table_name", null, values); 
+0

लेकिन इस तरह से मैं डेटाटाइम() – supergiox

+0

का उपयोग नहीं कर सकता, आप डेटाटाइम डीबी में लंबे समय तक डेटा को बचा सकते हैं। Cal.getTimeinMillis(); और जावा में डेटाटाइम में लंबे मूल्य को परिवर्तित कर सकते हैं। –

+0

मैं प्रारूप समस्याओं से बचने के लिए एसक्लाइट के डेटाटाइम() का उपयोग करना चाहता हूं ... लेकिन अगर यह एकमात्र तरीका है, तो मैं GetTimeinMillis() को डेटाटाइम में कैसे परिवर्तित कर सकता हूं? – supergiox

-2
String sql="INSERT INTO sms VALUES (null, '"+str1+"', '"+str2+"', '"+str3+"', datetime())"; 
dbw.rawQuery(sql, null); 

मार्क एकल उद्धरण।

+0

मैंने यह किया है, लेकिन समस्या बनी हुई है ... – supergiox

+1

किसी SQL क्वेरी में प्रत्यक्ष स्ट्रिंग का उपयोग करके आपका कोड SQL इंजेक्शन से प्रवण हो सकता है, इसका उपयोग न करें – Anuj

3

मैं इस तरह से साथ समस्या हल:

String sql="INSERT INTO sms VALUES (null,?,?,?,datetime('NOW'))"; 
dbw.execSQL(sql,new Object[]{mitt,dest,text}); 

अंत में मैं समस्याओं के बिना हर चार स्टोर कर सकते हैं !!!

+0

के लिए नहीं किया जा सकता है दुर्भाग्यवश मैंने इसे पाया जब मैंने आपका जवाब नहीं देखा था ... वैसे भी आप स्वीकार करने लायक हैं! – supergiox

+0

और मैन्युअल के बारे में जो execSQL के लिए कहता है: एक एकल SQL कथन निष्पादित करें जो कोई चयन/INSERT/अद्यतन/हटा नहीं है – Enriqe

संबंधित मुद्दे