Android SQLite- এ তারিখগুলি নিয়ে কাজ করার সর্বোত্তম উপায় [বন্ধ]


237

আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে এসকিউএলাইট ব্যবহার করে তারিখগুলি নিয়ে কাজ করতে আমার কিছুটা সমস্যা হচ্ছে। আমার কয়েকটি প্রশ্ন আছে:

  1. এসকিউএলাইটে (তারিখ, পূর্ণসংখ্যা, ...) তারিখগুলি সঞ্চয় করতে আমার কোন ধরণের ব্যবহার করা উচিত?
  2. তারিখগুলি সংরক্ষণ করার সর্বোত্তম উপায় দেওয়া হয়েছে কীভাবে আমি কন্টেন্টভ্যালু ব্যবহার করে এটি সঠিকভাবে সঞ্চয় করব?
  3. এসকিউএল ডাটাবেস থেকে তারিখটি পুনরুদ্ধার করার সর্বোত্তম উপায় কী?
  4. কীভাবে এসকিউএলাইটে কোনও এসকিএল নির্বাচন করবেন, তারিখ অনুসারে ফলাফল অর্ডার করবেন?

2
কেবল ক্যালেন্ডার শ্রেণি এবং তার সদস্য সময় ব্যবহার করুন (যা 1/1/1970 থেকে পাস হওয়া মিলিসেকেন্ডগুলির সংখ্যা উপস্থাপন করে)। ব্যবহারকারীর পঠনযোগ্য স্ট্রিংগুলিতে সময় মানকে পরিবর্তনের জন্য সদস্য ফাংশন রয়েছে।
স্লেটন

উত্তর:


43

এর মধ্যে তারিখগুলি সংরক্ষণ করতে আপনি একটি পাঠ্য ক্ষেত্র ব্যবহার করতে পারেন SQLite

ইউটিসি ফর্ম্যাটে তারিখগুলি সংরক্ষণ করা, ডিফল্ট আপনি যদি ব্যবহার করেন datetime('now') (yyyy-MM-dd HH:mm:ss)তবে তারিখের কলাম অনুসারে বাছাইয়ের অনুমতি দেওয়া হবে।

SQLiteআপনার কাছ থেকে স্ট্রিং হিসাবে তারিখগুলি পুনরুদ্ধার করার পরে ক্যালেন্ডার বা android.text.format.DateUtils.formatDateTimeপদ্ধতিটি ব্যবহার করে সেগুলি স্থানীয় আঞ্চলিক রূপে ফর্ম্যাট / রূপান্তর করতে পারে ।

এখানে আমি ব্যবহার করি এমন একটি আঞ্চলিকীকরণ বিন্যাস পদ্ধতি;

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

63
কীভাবে অনুসন্ধানের তারিখের সীমাগুলি পরিচালনা করবেন?
জো

51
"প্রস্তাবিত অনুশীলন"? ঠিক শব্দ হয় না।
শিম

135
যে বছরগুলিতে আমি এসকিউএল ব্যবহার করেছি আমি এর আগে কখনও কাউকে তারিখগুলি স্ট্রিং হিসাবে সংরক্ষণের পরামর্শ দিইনি। আপনার যদি নির্দিষ্ট তারিখের কলামের প্রকার না থাকে তবে ইউনিক্স সময়ে একটি পূর্ণসংখ্যা এবং স্টোরটি ব্যবহার করুন (মহাকাশ থেকে কয়েক সেকেন্ড)। এর বাছাইযোগ্য এবং ব্যাপ্তিযোগ্য পরিসীমা এবং সহজেই রূপান্তরিত।
মাইকবাবকক

20
তারিখগুলি স্ট্রিং হিসাবে সংরক্ষণ করা ঠিক আছে যদি আপনি এটিকে "তথ্য" হিসাবে সংরক্ষণ করতে চান তবে এমন কিছু যা আপনি পুনরুদ্ধার করেন এবং দেখান। তবে আপনি যদি তারিখগুলি "ডেটা" হিসাবে কাজ করতে চান এমন কিছু হিসাবে সংরক্ষণ করতে চান তবে আপনাকে এটি যুগের পূর্বে পূর্ণসংখ্যার হিসাবে সংরক্ষণ করা বিবেচনা করা উচিত। এটি আপনাকে তারিখের সীমাগুলি জিজ্ঞাসা করার অনুমতি দেবে, এটি স্ট্যান্ডার্ড তাই রূপান্তর ইত্যাদির বিষয়ে আপনাকে চিন্তা করার দরকার নেই string
ক্রিস্টিয়ান

8
SQLite ডকুমেন্টেশন তালিকা পাঠ্য হিসেবে সংরক্ষণ (ISO 8601) তারিখ সংরক্ষণের জন্য একটি টেকসই সমাধান হিসেবে। আসলে, এটি প্রথম তালিকাভুক্ত করা হয়।
anderspitman

211

সেরা উপায় হ'ল একটি সংখ্যা হিসাবে তারিখগুলি সংরক্ষণ করা, ক্যালেন্ডার কমান্ড ব্যবহার করে প্রাপ্ত।

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

কেন এমন করবেন? প্রথমত, একটি তারিখের পরিসর থেকে মান পাওয়া সহজ। কেবল আপনার তারিখটিকে মিলি সেকেন্ডে রূপান্তর করুন এবং তারপরে যথাযথভাবে ক্যোয়ার করুন। তারিখ অনুসারে বাছাই করা একইভাবে সহজ। আমি অন্তর্ভুক্ত হিসাবে বিভিন্ন ফর্ম্যাট মধ্যে রূপান্তর কলগুলি একইভাবে সহজ। নীচের লাইনটি হল, এই পদ্ধতিটির সাহায্যে আপনি যা কিছু করতে হবে তা করতে পারেন, কোনও সমস্যা নেই। এটি একটি কাঁচা মান পড়া সামান্য কঠিন হবে, তবে এটি সহজেই মেশিনে পঠনযোগ্য এবং ব্যবহারযোগ্য হয়ে ওঠার সাথে সামান্য অসুবিধা তৈরি করে। এবং প্রকৃতপক্ষে, একটি পাঠক তৈরি করা তুলনামূলকভাবে সহজ (এবং আমি জানি কিছু আছে) যা পাঠের সহজতার জন্য স্বয়ংক্রিয়ভাবে সময় ট্যাগকে তারিখে রূপান্তরিত করে।

এটি উল্লেখ করার মতো যে এর থেকে বের হওয়া মানগুলি দীর্ঘ হওয়া উচিত, অন্তর্নিহিত নয়। স্ক্লাইটে পূর্ণসংখ্যার অনেকগুলি অর্থ হতে পারে, 1-8 বাইট থেকে যে কোনও কিছুই, তবে প্রায় সমস্ত তারিখের জন্য b৪ বিট বা দীর্ঘ, যা কাজ করে।

সম্পাদনা: মন্তব্যে যেমন উল্লেখ করা হয়েছে, আপনি যদি এটি cursor.getLong()করেন তবে টাইমস্ট্যাম্পটি সঠিকভাবে পেতে আপনাকে ব্যবহার করতে হবে।


17
ধন্যবাদ ছেলে। লল আমি ভুল টাইপ করার কথা ভেবেছিলাম কিন্তু এটি খুঁজে পেলাম না। এটি অবশ্যই কার্সার.ইটলং () দ্বারা পুনরুদ্ধার করা উচিত, কার্সার.ইট আইটেন্ট () দ্বারা নয়। লোল নিজে হাসতে থামতে পারছে না। আবার ধন্যবাদ.
পুত্র হুয়ে ট্রান

37
  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. তারিখ অনুসারে অর্ডার করা সহজ এসকিউএল অর্ডার ধারা (কারণ আমাদের একটি সংখ্যার কলাম রয়েছে)। নিম্নলিখিতটি নেমে আসার আদেশ করবে (এটি সর্বশেষতম তারিখটি আগে যায়):

    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()এটি ইউটিসি মান তৈরি করার সাথে সাথে ব্যবহার করা নিরাপদ।


9

এসকিউএলাইট তারিখগুলি সঞ্চয় করতে পাঠ্য, বাস্তব, বা পূর্ণসংখ্যার ডেটা প্রকার ব্যবহার করতে পারে। আরও বেশি, আপনি যখনই কোনও অনুসন্ধান করেন, ফলাফলগুলি বিন্যাস ব্যবহার করে দেখানো হয় %Y-%m-%d %H:%M:%S

এখন, আপনি যদি এসকিউএল তারিখ / সময় ফাংশন ব্যবহার করে তারিখ / সময়ের মান সন্নিবেশ করান / আপডেট করেন তবে আপনি বাস্তবে মিলিসেকেন্ডগুলিও সঞ্চয় করতে পারেন। যদি এটি হয় তবে ফলাফলগুলি ফর্ম্যাট ব্যবহার করে দেখানো হবে %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

ঠিক কাজ করে।

শেষ পর্যন্ত, যখন কোনও প্রোগ্রামের মধ্যে প্রকৃত ক্রিয়াকলাপগুলি নিয়ে কাজ করা হয় (স্ক্লাইট ব্যবহার না করে এক্সিকিউটেবল ...)

বিটিডাব্লু: আমি জেডিবিসি ব্যবহার করছি (অন্যান্য ভাষা সম্পর্কে নিশ্চিত নয়) ... স্কয়ারাইট-জেডিবিসি ড্রাইভার ভিরিয়াল থেকে v3.7.2 - সম্ভবত আরও নতুন সংশোধনগুলি নীচে বর্ণিত আচরণটি পরিবর্তন করবে ... আপনি যদি অ্যান্ড্রয়েডে বিকাশ করছেন তবে আপনি করবেন না একটি জেডিবিসি-ড্রাইভার দরকার। সমস্ত এসকিউএল অপারেশন ব্যবহার করে জমা দেওয়া যেতে পারে SQLiteOpenHelper

JDBC এর বিভিন্ন পদ্ধতি কোন ডেটাবেস থেকে প্রকৃত তারিখ / সময় মান পেতে আছে: java.sql.Date, java.sql.Time, এবং java.sql.Timestamp

সংশ্লিষ্ট পদ্ধতিতে java.sql.ResultSet(স্পষ্টত) হয় 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.

যেহেতু এসকিউএলাইটের একটি আসল তারিখ / সময় / টাইমস্ট্যাম্প ডেটা টাইপ নেই এই 3 টি পদ্ধতিতে মানগুলি এমনভাবে ফিরে আসে যেগুলি 0:

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

সুতরাং, প্রশ্নটি হল: আমরা কীভাবে তারিখ / সময় / টাইমস্ট্যাম্প অবজেক্টগুলি নির্বাচন করতে, সন্নিবেশ করতে বা আপডেট করতে পারি? এর চেয়ে সহজ উত্তর নেই। আপনি বিভিন্ন সংমিশ্রণ চেষ্টা করতে পারেন তবে তারা আপনাকে সমস্ত এসকিউএল স্টেটমেন্টে এসকিউএলাইট ফাংশন এম্বেড করতে বাধ্য করবে। আপনার জাভা প্রোগ্রামের ভিতরে তারিখের অবজেক্টগুলিতে পাঠ্য রূপান্তরের জন্য কোনও ইউটিলিটি শ্রেণির সংজ্ঞা দেওয়া অনেক সহজ far তবে সর্বদা মনে রাখবেন যে এসকিউএলাইট যে কোনও তারিখের মান ইউটিসি +0000 এ রূপান্তর করে।

সংক্ষেপে, সর্বদা সঠিক ডেটা টাইপ ব্যবহার করার সাধারণ নিয়ম থাকা সত্ত্বেও, বা এমনকি ইউনিক্স সময়কে চিহ্নিত করার আগেও (পূর্ববর্তীকাল থেকে মিলি সেকেন্ড), তবুও আপনার সমস্ত এসকিউএল বিবৃতি জটিল করার জন্য আমি ডিফল্ট এসকিউএলাইট ফর্ম্যাটটি ( '%Y-%m-%d %H:%M:%f'বা জাভাতে 'yyyy-MM-dd HH:mm:ss.SSS') ব্যবহার করে অনেক সহজ মনে করি find SQLite ফাংশন। পূর্বের পদ্ধতির বজায় রাখা অনেক সহজ।

টোডো: অ্যান্ড্রয়েডের মধ্যে getDate / getTime / getTimestamp ব্যবহার করার সময় আমি ফলাফলগুলি যাচাই করব (API15 বা আরও ভাল) ... সম্ভবত অভ্যন্তরীণ ড্রাইভার স্ক্লাইট-জেডিবিসি থেকে আলাদা ...


1
এসকিউএলাইটের অভ্যন্তরীণ স্টোরেজ ইঞ্জিন দেওয়া, আমি নিশ্চিত নই যে আপনার উদাহরণগুলি আপনার দ্বারা বোঝানো হয়েছে: এটি ইঞ্জিনটির মতো দেখে মনে হচ্ছে "ঘোষিত এসকিউএল টাইপ নির্বিশেষে কোনও কলামে কোনও স্টোরেজ-টাইপযুক্ত মান সংরক্ষণ করার অনুমতি দেয়" ( বুকস জিমেইল)। ডি /… )। এটি আমার কাছে মনে হচ্ছে আপনার বাস্তব বনাম পূর্ণসংখ্য বনাম পাঠ্যের উদাহরণে যা ঘটছে তা হ'ল এসকিউএলাইট কেবল গাছের সমস্ত কলামে পাঠ্য হিসাবে পাঠ্য সংরক্ষণ করে। সুতরাং, স্বাভাবিকভাবেই ফলাফলগুলি ভাল, স্টোরেজ এখনও অপচয় হয়। যদি কেবল একটি পূর্ণসংখ্যার ব্যবহার করা হয়, তবে আপনার মিলিসেকেন্ডগুলি আলগা করা উচিত। শুধু বলছি ...
মার্কো

প্রকৃতপক্ষে, আপনি কেবলমাত্র একটি নির্বাচিত ডেটটাইম (কল 3, 'ইউনিক্সপচ') FROM টেস্ট_ টেবিল করে যা বলেছেন তা নিশ্চিত করতে পারেন। এটি আপনার উদাহরণগুলির জন্য খালি সারিগুলি দেখায় ... পরীক্ষার খাতিরে যদি না আপনি কোনও প্রকৃত পূর্ণসংখ্যার প্রবেশ করান। উদাহরণস্বরূপ, আপনি যদি কল 3 মান 37 দিয়ে একটি সারি যুক্ত করতে চান তবে উপরের নির্বাচনী বিবৃতিটি প্রদর্শিত হবে: 1970-01-01 00:00:37। সুতরাং, যদি না আপনি টেক্সট স্ট্রিং হিসাবে অদক্ষভাবে আপনার সমস্ত তারিখগুলি সংরক্ষণের সাথে ভাল হন তবে আপনার পরামর্শ মতো করবেন না।
মার্কো

আমি এই উত্তরটি পোস্ট করার পরে অনেক দিন হয়েছে ... সম্ভবত এসকিউএলাইট আপডেট হয়েছে। আমি কেবল ভাবতে পারি এসকিউএল স্টেটমেন্টগুলি আবার বনাম আপনার পরামর্শগুলি কার্যকর করা।
স্থানান্তরিত

3

সাধারণত (আমি মাইএসকিএল / পোস্টগ্রিসের মতোই) টাইমস্ট্যাম্প ফর্ম্যাটে সংরক্ষণের জন্য আমি তারিখগুলি ইনট (মাইএসকিএল / পোস্ট) বা পাঠ্য (স্ক্লাইট) সঞ্চয় করি।

তারপরে আমি এগুলিকে তারিখ অবজেক্টে রূপান্তর করব এবং ব্যবহারকারীর টাইমজোনের ভিত্তিতে ক্রিয়া করব perform


3

দোকান থেকে শ্রেষ্ঠ উপায় dateমধ্যে SQLite ডিবি বর্তমান বাজারের হয় DateTimeMilliseconds। নীচে কোড স্নিপেটটি তাই করতে হবে_

  1. পাওয়া DateTimeMilliseconds
public static long getTimeMillis(String dateString, String dateFormat) throws ParseException {
    /*Use date format as according to your need! Ex. - yyyy/MM/dd HH:mm:ss */
    String myDate = dateString;//"2017/12/20 18:10:45";
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/);
    Date date = sdf.parse(myDate);
    long millis = date.getTime();

    return millis;
}
  1. আপনার ডিবিতে ডেটা .োকান
public void insert(Context mContext, long dateTimeMillis, String msg) {
    //Your DB Helper
    MyDatabaseHelper dbHelper = new MyDatabaseHelper(mContext);
    database = dbHelper.getWritableDatabase();

    ContentValues contentValue = new ContentValues();
    contentValue.put(MyDatabaseHelper.DATE_MILLIS, dateTimeMillis);
    contentValue.put(MyDatabaseHelper.MESSAGE, msg);

    //insert data in DB
    database.insert("your_table_name", null, contentValue);

   //Close the DB connection.
   dbHelper.close(); 

}

Now, your data (date is in currentTimeMilliseconds) is get inserted in DB .

পরবর্তী পদক্ষেপটি হল, আপনি যখন ডিবি থেকে ডেটা পুনরুদ্ধার করতে চান তখন আপনাকে সংশ্লিষ্ট তারিখের সময় মিলি সেকেন্ডগুলিকে সংশ্লিষ্ট তারিখে রূপান্তর করতে হবে। নীচে একই কাজ করতে নমুনা কোড স্নিপেট

  1. তারিখের স্ট্রিংয়ে তারিখ মিলিসেকেন্ডগুলিকে রূপান্তর করুন।
public static String getDate(long milliSeconds, String dateFormat)
{
    // Create a DateFormatter object for displaying date in specified format.
    SimpleDateFormat formatter = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/);

    // Create a calendar object that will convert the date and time value in milliseconds to date.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(milliSeconds);
    return formatter.format(calendar.getTime());
}
  1. এখন, অবশেষে ডেটা আনুন এবং এর কার্যকারিতা দেখুন ...
public ArrayList<String> fetchData() {

    ArrayList<String> listOfAllDates = new ArrayList<String>();
    String cDate = null;

    MyDatabaseHelper dbHelper = new MyDatabaseHelper("your_app_context");
    database = dbHelper.getWritableDatabase();

    String[] columns = new String[] {MyDatabaseHelper.DATE_MILLIS, MyDatabaseHelper.MESSAGE};
    Cursor cursor = database.query("your_table_name", columns, null, null, null, null, null);

    if (cursor != null) {

        if (cursor.moveToFirst()){
            do{
                //iterate the cursor to get data.
                cDate = getDate(cursor.getLong(cursor.getColumnIndex(MyDatabaseHelper.DATE_MILLIS)), "yyyy/MM/dd HH:mm:ss");

                listOfAllDates.add(cDate);

            }while(cursor.moveToNext());
        }
        cursor.close();

    //Close the DB connection.
    dbHelper.close(); 

    return listOfAllDates;

}

আশা করি এটি সকলকে সাহায্য করবে! :)


এসকিউএলাইট দীর্ঘ ডেটাটাইপ সমর্থন করে না। সম্পাদনা: আমার ভুল, INTEGER 8 বাইট দীর্ঘ, সুতরাং এটি এই ডাটাটাইপ সমর্থন করা উচিত।
আন্তোনিও ভ্লাসিক

1

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

এখানে দেখো:

এসকিউএলডিট ডাটাবেসে ক্যোয়ারী ()

4 - উত্তর 3 দেখুন


1

আমি এই পছন্দ। এটি সেরা উপায় নয়, তবে দ্রুত সমাধান।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.