दिलचस्प पोस्ट
संप्रभु और असली दुनिया उदाहरण contravariance यदि कोई चयनकर्ता रिक्त करता है तो मुझे कैसे पता लगा सकता है? फ़ंक्शन के हस्ताक्षर में कीवर्ड फेंकें ऑब्जेक्ट सी # में जेनेरिक प्रकार का है अगर परीक्षण एक पोस्टग्रेएसक्यूएल 'समूह' क्वेरी में स्ट्रिंग फ़ील्ड के स्ट्रिंग को कैसे संरेखित करें? डेटाटाइबल आर में कॉलम का सबसेट चुनें मैं Django टेम्पलेट्स में छवि फ़ाइलों को कैसे शामिल करूं? JSP में विशिष्ट बटन की क्लिक / सबमिट करने पर मैं एक विशिष्ट जावा विधि कैसे कॉल करूं? asp.net MVC आंशिक दृश्य नियंत्रक कार्रवाई ओएस एक्स पर पीजी मणि स्थापित करना – देशी एक्सटेंशन को बनाने में विफलता मध्यांतर बीत गया। समय समाप्ति अवधि का संचालन पूरा होने से पहले समाप्त हो रहा है या सर्वर प्रतिसाद नहीं दे रहा है। बयान समाप्त कर दिया गया है सी ++ एसटीएल जैसी वेक्टर वर्ग की तलाश में है लेकिन स्टैक स्टोरेज का उपयोग करना सी # में एक शब्दकोश पर पुनरावृति का सबसे अच्छा तरीका क्या है? मैं जीआईटी रिपॉजिटरी से पूरी तरह से फाइल कैसे निकाल सकता हूं? लेआउट एसयूवीएव्स कहां है?

Android SQLite में दिनांक के साथ काम करने का सर्वोत्तम तरीका

मुझे अपने एंड्रॉइड एप्लिकेशन की तिथियों के साथ काम करने में कुछ परेशानी हो रही है जो कि SQLite का उपयोग करता है मेरे कुछ सवाल हैं:

  1. SQLite (टेक्स्ट, पूर्णांक, …) में तिथियों को स्टोर करने के लिए मुझे किस प्रकार का उपयोग करना चाहिए?
  2. तिथियों को स्टोर करने का सबसे अच्छा तरीका देखते हुए मैं सामग्री मूल्यों का सही उपयोग कैसे करूँ?
  3. SQLite डेटाबेस से तारीख को पुनर्प्राप्त करने का सबसे अच्छा तरीका क्या है?
  4. SQLite पर एक एसक्यूएल का चयन कैसे करें, तिथि से परिणाम ऑर्डर करने के लिए?

वेब के समाधान से एकत्रित समाधान "Android SQLite में दिनांक के साथ काम करने का सर्वोत्तम तरीका"

आप SQLite भीतर तिथियों को स्टोर करने के लिए एक टेक्स्ट फ़ील्ड का उपयोग कर सकते हैं

यूटीसी प्रारूप में तारीखों को संग्रहीत करना, डिफ़ॉल्ट यदि आप (yyyy-MM-dd HH:mm:ss) datetime('now') (yyyy-MM-dd HH:mm:ss) का उपयोग करते हैं, तो वह दिनांक कॉलम द्वारा सॉर्टिंग की अनुमति देगा।

SQLite से स्ट्रिंग्स के रूप में तारों को पुनर्प्राप्त करना, आप कैलेंडर / android.text.format.DateUtils.formatDateTimeandroid.text.format.DateUtils.formatDateTime विधि का उपयोग करके स्थानीय क्षेत्रीय स्वरूपों में आवश्यकतानुसार उन्हें स्वरूपित / रूपांतरित कर सकते हैं।

यहाँ एक regionalised formatter विधि है जिसका उपयोग मैं करता हूं;

 public static String formatDateTime(Context context, String timeToFormat) { String finalDateTime = ""; SimpleDateFormat iso8601Format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date date = null; if (timeToFormat != null) { try { date = iso8601Format.parse(timeToFormat); } catch (ParseException e) { date = null; } if (date != null) { long when = date.getTime(); int flags = 0; flags |= android.text.format.DateUtils.FORMAT_SHOW_TIME; flags |= android.text.format.DateUtils.FORMAT_SHOW_DATE; flags |= android.text.format.DateUtils.FORMAT_ABBREV_MONTH; flags |= android.text.format.DateUtils.FORMAT_SHOW_YEAR; finalDateTime = android.text.format.DateUtils.formatDateTime(context, when + TimeZone.getDefault().getOffset(when), flags); } } return finalDateTime; } 

कैलेंडर आदेश का उपयोग करके प्राप्त दिनांक को एक संख्या के रूप में सहेजना सबसे अच्छा तरीका है

 //Building the table includes: StringBuilder query=new StringBuilder(); query.append("CREATE TABLE "+TABLE_NAME+ " ("); query.append(COLUMN_ID+"int primary key autoincrement,"); query.append(COLUMN_DATETIME+" int)"); //And inserting the data includes this: values.put(COLUMN_DATETIME, System.currentTimeMillis()); 

यह क्यों? सबसे पहले, तिथि सीमा से मूल्य प्राप्त करना आसान है। बस अपनी तिथि को मिलीसेकंड में परिवर्तित करें, और फिर उचित रूप से क्वेरी करें। तिथि से छंटनी समान रूप से आसान है विभिन्न स्वरूपों में कनवर्ट करने के लिए कॉल भी उतने आसान होते हैं, जैसा मैंने इसमें शामिल किया था। नीचे की रेखा इस विधि से है, आप कुछ भी करने की ज़रूरत कर सकते हैं, कोई समस्या नहीं है। एक कच्चे मान को पढ़ने में थोड़ा मुश्किल होगा, लेकिन यह मशीन से आसानी से पढ़ने योग्य और प्रयोग करने योग्य होने के साथ थोड़ी हानि बनाता है। और वास्तव में, यह रीडर बनाने में अपेक्षाकृत आसान है (और मैं जानता हूं कि वहां कुछ है) जो स्वचालित रूप से समय टैग को अद्यतित कर देगा जैसे कि पढ़ने में आसान।

यह उल्लेखनीय है कि इस से बाहर आने वाले मूल्यों को लंबे समय तक नहीं होना चाहिए, नहीं int। SQLite में पूर्णांक बहुत सी बातें, 1-8 बाइट्स से कुछ भी हो सकता है, लेकिन लगभग सभी 64 बिट या लंबे समय तक, काम करता है।

संपादित करें: जैसा कि टिप्पणियों में बताया गया है, यदि आप ऐसा करते हैं, तो आपको टाइमस्टैम्प को ठीक से cursor.getLong() का उपयोग करना होगा।

  1. जैसा कि इस टिप्पणी में अनुमानित है , मैं हमेशा तिथियों को स्टोर करने के लिए पूर्णांक का उपयोग करता हूं
  2. भंडारण के लिए, आप उपयोगिता विधि का उपयोग कर सकते हैं

     public static Long persistDate(Date date) { if (date != null) { return date.getTime(); } return null; } 

    इस तरह:

     ContentValues values = new ContentValues(); values.put(COLUMN_NAME, persistDate(entity.getDate())); long id = db.insertOrThrow(TABLE_NAME, null, values); 
  3. एक अन्य उपयोगिता विधि लोडिंग का ख्याल रखता है

     public static Date loadDate(Cursor cursor, int index) { if (cursor.isNull(index)) { return null; } return new Date(cursor.getLong(index)); } 

    इस तरह से इस्तेमाल किया जा सकता है:

     entity.setDate(loadDate(cursor, INDEX)); 
  4. तिथि के अनुसार सरल एसक्यूएल ORDER खंड है (क्योंकि हमारे पास एक संख्यात्मक स्तंभ है)। नीचे उतरने का आदेश दिया जाएगा (जो कि सबसे नई तिथि पहले की जाती है):

     public static final String QUERY = "SELECT table._id, table.dateCol FROM table ORDER BY table.dateCol DESC"; //... Cursor cursor = rawQuery(QUERY, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { // Process results } 

हमेशा यूटीसी / जीएमटी समय को स्टोर करने के लिए सुनिश्चित करें, खासकर जब java.util.Calendar और java.text.SimpleDateFormat साथ काम करते समय डिफ़ॉल्ट (यानी आपके उपकरण का) समय क्षेत्र का उपयोग करें। java.util.Date.Date() उपयोग करने के लिए सुरक्षित है क्योंकि यह एक यूटीसी मूल्य बनाता है।

SQLite तिथियों को स्टोर करने के लिए पाठ, वास्तविक या पूर्णांक डेटा प्रकारों का उपयोग कर सकता है। और भी, जब भी आप कोई क्वेरी करते हैं, तो परिणाम स्वरूप %Y-%m-%d %H:%M:%S का उपयोग कर दिखाया गया है।

अब, यदि आप SQLite दिनांक / समय फ़ंक्शंस का उपयोग करते हुए तारीख / समय मान डालें / अपडेट करते हैं, तो आप वास्तव में मिलसेकंडों को भी स्टोर कर सकते हैं। यदि ऐसा मामला है, तो परिणाम प्रारूप %Y-%m-%d %H:%M:%f का उपयोग कर दिखाया गया है। उदाहरण के लिए:

 sqlite> create table test_table(col1 text, col2 real, col3 integer); sqlite> insert into test_table values ( strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') ); sqlite> insert into test_table values ( strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126') ); sqlite> select * from test_table; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126 

अब, यह सत्यापित करने के लिए कुछ पूछताछ कर रहे हैं कि क्या हम वास्तव में समय की तुलना करने में सक्षम हैं:

 sqlite> select * from test_table /* using col1 */ where col1 between strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.121') and strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125'); 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 

आप उसी SELECT को चेक col2 और col3 से देख सकते हैं और आपको एक ही परिणाम मिलेगा। जैसा कि आप देख सकते हैं, दूसरी पंक्ति (126 मिलीसेकेंड) वापस नहीं की जाती है।

ध्यान दें कि BETWEEN में समावेशी है, इसलिए …

 sqlite> select * from test_table where col1 between /* Note that we are using 123 milliseconds down _here_ */ strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') and strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125'); 

… एक ही सेट वापस करेगा।

विभिन्न तिथि / समय सीमाओं के साथ खेलने की कोशिश करें और सब कुछ अपेक्षित रूप से व्यवहार करेगा।

बिना strftime फ़ंक्शन के बारे में क्या?

 sqlite> select * from test_table /* using col1 */ where col1 between '2014-03-01 13:01:01.121' and '2014-03-01 13:01:01.125'; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 

strftime फ़ंक्शन और बिना मिलीसेकेंड के बारे में क्या है?

 sqlite> select * from test_table /* using col1 */ where col1 between '2014-03-01 13:01:01' and '2014-03-01 13:01:02'; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126 

के बारे में क्या ORDER BY ?

 sqlite> select * from test_table order by 1 desc; 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 sqlite> select * from test_table order by 1 asc; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126 

सिर्फ ठीक काम करता है

अंत में, जब एक कार्यक्रम के भीतर वास्तविक संचालन से निपटने (SQLite निष्पादन योग्य का उपयोग किए बिना) …

बीटीडब्लू: मैं जेडीबीसी (अन्य भाषाओं के बारे में निश्चित नहीं) का उपयोग कर रहा हूं … एसईएलएलटी-जेडीबीसी चालक v3.7.2 एक्सरेियल से – शायद नया संशोधन नीचे दिए गए व्यवहार को बदलते हैं … अगर आप एंड्रॉइड में विकास कर रहे हैं, तो आप एक जेडीबीसी ड्राइवर की आवश्यकता है SQLiteOpenHelper का उपयोग करके सभी एसक्यूएल परिचालनों को प्रस्तुत किया जा सकता है

जेडीबीसी के डेटाबेस से वास्तविक दिनांक / समय मान पाने के लिए विभिन्न तरीकों हैं: java.sql.Date , java.sql.Time , और java.sql.Timestamp

getTime(..) में संबंधित तरीकों getTimestamp() क्रमशः getTimestamp() getDate(..) , getTime(..) , और getTimestamp() क्रमशः हैं।

उदाहरण के लिए:

 Statement stmt = ... // Get statement from connection ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_TABLE"); while (rs.next()) { System.out.println("COL1 : "+rs.getDate("COL1")); System.out.println("COL1 : "+rs.getTime("COL1")); System.out.println("COL1 : "+rs.getTimestamp("COL1")); System.out.println("COL2 : "+rs.getDate("COL2")); System.out.println("COL2 : "+rs.getTime("COL2")); System.out.println("COL2 : "+rs.getTimestamp("COL2")); System.out.println("COL3 : "+rs.getDate("COL3")); System.out.println("COL3 : "+rs.getTime("COL3")); System.out.println("COL3 : "+rs.getTimestamp("COL3")); } // close rs and stmt. 

चूंकि SQLite में वास्तविक दिनांक / समय / TIMESTAMP डेटा प्रकार नहीं है, इसलिए ये सभी 3 विधियों के मूल्यों को वापस लौटाते हैं जैसे कि ऑब्जेक्ट्स को 0 से आरंभ किया गया था:

 new java.sql.Date(0) new java.sql.Time(0) new java.sql.Timestamp(0) 

तो, सवाल यह है कि हम वास्तव में दिनांक / समय / टाइमस्टैम्प ऑब्जेक्ट कैसे चुन सकते हैं, डालें, या अपडेट कर सकते हैं? कोई आसान जवाब नहीं है आप विभिन्न संयोजनों की कोशिश कर सकते हैं, लेकिन वे आपको सभी SQL कथन में SQLite फ़ंक्शन एम्बेड करने के लिए बाध्य करेंगे। अपने जावा प्रोग्राम के अंदर टेक्स्ट ऑब्जेक्ट को बदलने के लिए उपयोगिता वर्ग को परिभाषित करना अब तक आसान है लेकिन हमेशा याद रखें कि SQLite यूटीसी + 0000 के लिए कोई भी दिनांक मान बदल देती है

संक्षेप में, सामान्य नियम के बावजूद, हमेशा सही डेटा प्रकार का उपयोग करने के लिए, या, यूनिक्स समय (युग के बाद से मिलीसेकंड) को इंगित करने वाले पूर्णांक भी, मैं डिफ़ॉल्ट SQLite स्वरूप ( '%Y-%m-%d %H:%M:%f' का उपयोग करते हुए बहुत आसान लगता है '%Y-%m-%d %H:%M:%f' या जावा में 'yyyy-MM-dd HH:mm:ss.SSS' ) के बजाय SQLite फ़ंक्शन के साथ अपने सभी SQL कथन जटिल। पूर्व दृष्टिकोण बनाए रखने के लिए बहुत आसान है

TODO: एंड्रॉइड के अंदर getDate / getTime / getTimestamp (एपीआई15 या बेहतर) का उपयोग करते समय मैं परिणामों की जांच करूंगा … शायद आंतरिक चालक एसक्लाइट-जेडीबीसी से अलग है …

आम तौर पर (जैसा कि मैं mysql / postgres में करता हूं) मैं टाइमस्टैम्प प्रारूप में उन्हें स्टोर करने के लिए int (mysql / post) या टेक्स्ट (sqlite) में तिथियां संग्रहीत करता हूं I

तब मैं उन्हें डेट ऑब्जेक्ट्स में बदलकर उपयोगकर्ता टाइम ज़ोन पर आधारित क्रियाओं को बदलूंगा

1-सटीक तरह से स्टीरमी ने कहा।

2 – कृपया इसे पढ़ें: http://www.vogella.de/articles/AndroidSQLite/article.html

3 –

 Cursor cursor = db.query(TABLE_NAME, new String[] {"_id", "title", "title_raw", "timestamp"}, "//** YOUR REQUEST**//", null, null, "timestamp", null); 

यहाँ देखें:

SQLiteDatabase में क्वेरी ()

4 – जवाब 3 देखें

यह मेरे लिए ज़्यादा प्रधान है। यह सबसे अच्छा तरीका नहीं है, लेकिन एक तेज़ समाधान है

 //Building the table includes: StringBuilder query= new StringBuilder(); query.append("CREATE TABLE "+TABLE_NAME+ " ("); query.append(COLUMN_ID+"int primary key autoincrement,"); query.append(COLUMN_CREATION_DATE+" DATE)"); //Inserting the data includes this: SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); values.put(COLUMN_CREATION_DATE,dateFormat.format(reactionGame.getCreationDate())); // Fetching the data includes this: try { java.util.Date creationDate = dateFormat.parse(cursor.getString(0); YourObject.setCreationDate(creationDate)); } catch (Exception e) { YourObject.setCreationDate(null); } 

"SELECT" + _ID + "," + + _ CREATED_DATE + "," + _ DATE_TIME + "FROM" + TBL_NOTIFICATION + "" द्वारा आदेश "strftime (% s," + + DATE_TIME + ") DESC";