Androidアプリケーションで日時が「現在」に設定された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')");

正しい解決策ではありません。列を「datetime( 'now')」テキストに設定するだけです。


1
ここでの1つの問題は、AndroidがDBにSQLiteを使用していることです。列を特定のタイプに設定できますが、それは列の「アフィニティ」を設定するだけです。SQLiteでは、宣言方法に関係なく、任意の列に任意の値を配置できます。SQLiteが文字列 'date'をどこにでも入れても大丈夫です。sqlite.orgには、より完全な説明があります。以下のe-satisの回答に投票します。それが私が行う方法です(具体的にはJavaの方法)。
ウィル

回答:


194

Javaラッパー「ContentValues」を使用してdatetime関数を使用することはできません。次のいずれかを使用できます。

  • SQLiteDatabase.execSQL。生のSQLクエリを入力できます。

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • または、Javaの日時機能:

    // 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ですか?
グレッグB

5
java.util.Dateですが、java.sql.Dateの日付でも実行できます。
e-satis

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 Java日付関数を使用する

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 2015

@erikもっと詳しい情報を教えてもらえますか、私はあなたが言ったことを正確に理解していません。
Rikin Patel、2015

上記のように、Dateオブジェクトを取得してそれを文字列に変換し、sqlite列に配置します。
erik 2015

1
@erik SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); formatter.parse(created_at);
Saksham 2016年

8

使用できるオプションがいくつかあります。

  1. 代わりに文字列 "(DATETIME( 'now'))"を使用してみてください。
  2. 日時を自分で挿入します。つまり、System.currentTimeMillis()を使用します。
  3. SQLiteテーブルを作成するときに、created_date列のデフォルト値を現在の日時として指定します。
  4. SQLiteDatabase.execSQLを使用して直接挿入します。

ナンバー1は、仕事(少なくともない使用していないときContentValuesupdate()、それだけで文字列を置くDATETIME('now')の列に。
バートFriederichsの

1
2つ目はタイムゾーンに問題があります。レコードを挿入し、DEFAULT CURRENT_TIMESTAMP後でSystem.currentTimeMillis()更新に使用しました。時差があります。
Bart Friederichs 2013年

@sooniln(DATETIME( 'now'))が実際に現在の日時を挿入することを確認しましたか?
IgorGanapolsky 2014年

ローカルのdatetimeを追加したい場合は、代わりに "datetime( 'now'、 'localtime')"を使用してください
Simon

7

私には、問題は"datetime('now')"値ではなく文字列として送信しているように見えます。

私の考えは、現在の日付/時刻を取得してデータベースに日付/時刻値として送信する方法を見つけるか、SQLiteの組み込み(DATETIME('NOW'))パラメーターを使用する方法を見つけることです

このSO.comの質問で anwsersをチェックしてください-彼らはあなたを正しい方向に導くかもしれません。

うまくいけば、これが役立ちます!


5

あなたはJavaの機能を使用することができます:

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をnew Date(l)の代わりに、日付の列に数値を挿入します。
だから、あなたはあなたの日付を持っています。
たとえば、私は自分のデータベースにこの番号を保存します:1332342462078
しかし、上記のメソッドを呼び出すと、次の結果が得られます:21-mar-2012 16.07.42


3

@ e-satisの回答に基づいて、「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

式「(DATETIME( 'now'))」を使用してデフォルトのタイムスタンプを挿入しようとしているのと同時に、フィールドが「not null」としてマークされていないことを確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.