एंड्रॉइड एप्लिकेशन में 'अब' के लिए एक सेटटाइम के साथ एक SQLite रिकॉर्ड कैसे डालें?


109

कहो, हमारे पास एक तालिका बनाई गई है:

create table notes (_id integer primary key autoincrement, created_date date)

रिकॉर्ड डालने के लिए, मैं उपयोग करूँगा

ContentValues initialValues = new ContentValues(); 
initialValues.put("date_created", "");
long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);

लेकिन अब तक date_created कॉलम कैसे सेट करें ? इसे स्पष्ट करने के लिए,

initialValues.put("date_created", "datetime('now')");

क्या सही समाधान नहीं है। यह कॉलम को "डेटाइम ('अब') टेक्स्ट पर सेट करता है।


1
यहाँ एक समस्या यह है कि Android DBite के लिए SQLite का उपयोग करता है। आप एक कॉलम को एक निश्चित प्रकार पर सेट कर सकते हैं, लेकिन यह कॉलम को 'आत्मीयता' निर्धारित करता है। SQLite आपको किसी भी कॉलम में किसी भी मूल्य को रखने की अनुमति देगा चाहे वह कैसे भी घोषित हो। कहीं भी स्ट्रिंग 'तारीख' डालने के लिए SQLite बहुत ठीक है। sqlite.org की अधिक गहन व्याख्या है। मैं नीचे ई-सिटिस के जवाब को वोट कर रहा हूं, कि मैं इसे कैसे करता हूं (विशेष रूप से जावा तरीका)।
होगा

जवाबों:


194

आप जावा आवरण "ContentValues" का उपयोग करके डेटाटाइम फ़ंक्शन का उपयोग नहीं कर सकते। या तो आप उपयोग कर सकते हैं:

  • SQLiteDatabase.execSQL ताकि आप एक कच्ची SQL क्वेरी दर्ज कर सकें।

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • या जावा तिथि समय क्षमताओं:

    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date date = new Date();
    ContentValues initialValues = new ContentValues(); 
    initialValues.put("date_created", dateFormat.format(date));
    long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);
    

1
कृपया सुधार कोड को 'कोड नमूना' के रूप में देखें। अन्यथा अच्छा जवाब।
विल

3
यह एक java.util.Date या java.sql.Date है?
ग्रेग बी

5
java.util.Date, लेकिन मुझे यकीन है कि आप इसे java.sql.Date तारीख के साथ भी कर सकते हैं।
ई-सिटिस

44

मेरे कोड में मैं DATETIME DEFAULT CURRENT_TIMESTAMPकॉलम के प्रकार और बाधा के रूप में उपयोग करता हूं ।

आपके मामले में आपकी तालिका परिभाषा होगी

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)

32

विधि 1

CURRENT_TIME  Inserts only time
CURRENT_DATE  Inserts only date
CURRENT_TIMESTAMP  Inserts both time and date

CREATE TABLE users(
    id INTEGER PRIMARY KEY,
    username TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

विधि 2

db.execSQL("INSERT INTO users(username, created_at) 
            VALUES('ravitamada', 'datetime()'");

विधि 3 जावा तिथि कार्यों का उपयोग करना

private String getDateTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = new Date();
        return dateFormat.format(date);
}

ContentValues values = new ContentValues();
values.put('username', 'ravitamada');
values.put('created_at', getDateTime());
// insert the row
long id = db.insert('users', null, values);

जिज्ञासु, क्या आप दिखा सकते हैं कि आप परिणामी स्ट्रिंग को DATE ऑब्जेक्ट पर वापस कैसे स्विच करेंगे?
इरिक

@erik क्या आप अधिक जानकारी दे सकते हैं, मैं बिल्कुल नहीं कह रहा हूं कि आपने क्या कहा।
रिकिन पटेल

तो ऊपर आप एक डेट ऑब्जेक्ट ले रहे हैं और इसे एक sqlite कॉलम में रखे जाने के लिए एक स्ट्रिंग में कनवर्ट कर रहे हैं .. लेकिन जब आप डेटाबेस से उस स्ट्रिंग को खींचते हैं, तो आप इसे डेट ऑब्जेक्ट में कैसे परिवर्तित करते हैं?
इरिक

1
@erik SimpleDateFormat फ़ॉर्मेटर = नया SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); (created_at) formatter.parse;
सकशम

8

कुछ विकल्प हैं जिनका आप उपयोग कर सकते हैं:

  1. आप इसके बजाय "(DATETIME ('अब'))" स्ट्रिंग का उपयोग करने का प्रयास कर सकते हैं।
  2. स्वयं को सम्मिलित करें, अर्थात System.currentTimeMillis () के साथ
  3. SQLite तालिका बनाते समय, वर्तमान दिनांक समय के रूप में create_date कॉलम के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करें।
  4. सीधे सम्मिलित करने के लिए SQLiteDatabase.execSQL का उपयोग करें ।

नंबर 1 काम नहीं करता है (कम से कम उपयोग करते समय ContentValuesऔर नहीं update(), यह सिर्फ तार DATETIME('now')में तार डालता है ।
बार्ट फ्राइडरिच्स

1
दूसरे को टाइमजोन की समस्या है। मैंने एक रिकॉर्ड डाला DEFAULT CURRENT_TIMESTAMPऔर बाद System.currentTimeMillis()में अपडेट किया। मैं एक घंटे का अंतर देखता हूं।
बार्ट फ्राइडरिच्स

@sooniln क्या आपने सत्यापित किया है कि (DATETIME ('अब') वास्तव में वर्तमान डेटाटाइम सम्मिलित करेगा?
इगोरगानापोलस्की 16

यदि आप स्थानीय डेटाटाइम जोड़ना चाहते हैं, तो इसके बजाय "डेटाइम ('अब', 'स्थानीय समय') का उपयोग करने का प्रयास करें
साइमन

7

मेरे लिए, समस्या यह दिखती है कि आप "datetime('now')"मान के बजाय स्ट्रिंग के रूप में भेज रहे हैं ।

मेरा विचार वर्तमान तिथि / समय को हथियाने और दिनांक / समय मान के रूप में अपने डेटाबेस को भेजने का एक तरीका खोजना है, या SQLite के अंतर्निहित (DATETIME('NOW'))पैरामीटर का उपयोग करने का एक तरीका खोजना है।

इस SO.com प्रश्न पर awsers देखें - वे आपको सही दिशा में ले जा सकते हैं।

उम्मीद है कि यह मदद करता है!


5

आप जावा के कार्य का उपयोग कर सकते हैं:

ContentValues cv = new ContentValues();
cv.put(Constants.DATE, java.lang.System.currentTimeMillis());  

इस तरह, आपके db में आप एक नंबर सेव करते हैं।
इस संख्या की व्याख्या इस प्रकार की जा सकती है:

    DateFormat dateF = DateFormat.getDateTimeInstance();
    String data = dateF.format(new Date(l));

नए दिनांक (l) में l के बजाय, आप संख्या को दिनांक के कॉलम में सम्मिलित करते हैं।
तो, आपके पास अपनी तारीख है।
उदाहरण के लिए मैं अपने db में इस नंबर को बचाता हूं: 1332342462078
लेकिन जब मैं ऊपर की विधि कहता हूं तो यह परिणाम होता है: 21-mar-2012 16.07.42


3

@ ई-सटिस उत्तर के आधार पर मैंने अपने "DBTools" वर्ग पर एक निजी विधि बनाई ताकि वर्तमान तिथि जोड़ना अब वास्तव में आसान हो:

...
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
...
        private String getNow(){
            // set the format to sql date time
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            return dateFormat.format(date);
        }
...

इसे इस तरह उपयोग करें: values.put("lastUpdate", getNow());


1

मेरे लिए सही काम करता है:

    values.put(DBHelper.COLUMN_RECEIVEDATE, geo.getReceiveDate().getTime());

अपनी तिथि को लंबे समय तक बचाएं।



0

सुनिश्चित करें कि फ़ील्ड को 'null नहीं' के रूप में उसी समय चिह्नित किया गया है जब आप अभिव्यक्ति का उपयोग करके डिफ़ॉल्ट समय स्टैम्प सम्मिलित करने का प्रयास कर रहे हैं "(DATETIME ('अब'))"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.