Android關於SQLite的日期時間的存儲

最近一直在學習Android,因爲Xana的Java徹底是半路出家,之前一直在用C#、C++和Python之類的東西,對於時間和日期的處理,一直沒能弄得比較清楚。html

說清楚,SQLite

SQLite中,原始的存儲只有如下幾種(SQLite文檔)java

  • NULL。只有null。
  • INTEGER。有符號整數,根據值的大小存儲在1-4字節中。
  • REAL。浮點數,儲存爲8字節的IEEE浮點數。
  • TEXT。文字字符串,根據數據庫編碼存儲(UTF-8/UTF-16BE/UTF-16LE)
  • BLOB。純數據儲存。

Android和Java怎麼作

Java中,時間和日期相關類主要是如下:sql

  • java.util.Date

和它的子類:數據庫

  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

以及相關的操做類:學習

  • java.util.Calendar
  • java.util.GregorianCalendar

用哪一個?

其中,java.sql下的DateTime分別是「閹割」了的java.util.Date,而java.sql.Timestamp是強化版增長了微秒的java.util.Date,綜上所述,通常而言,用java.util.Date便可。編碼

怎麼用?

Java中日期和時間都是經過1970年後的毫秒數來儲存的,因此,咱們在數據庫種只須要存儲日期時間的毫秒數便可,調用code

java.util.Date date = new java.util.Date();
long datetime = date.getTime();

數據庫能夠這麼定義:sqlite

CREATE TABLE IF NOT EXISTS Journal(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    content TEXT,
    writeTime INTEGER
);

這個地方其實我被折騰了好久,由於Java中用long來存儲毫秒數,即int64,但SQLite中只有INTEGER,後來看了文檔,這裏的INTEGER是支持1-4字節,便可以存儲longhtm

插入能夠這麼來:文檔

java.util.Date writeTime = new java.util.Date();
ContentValues values = new ContentValues();
values.put("content", content);
values.put("writeTime", writeTime.getTime());

按日期查找……WTF?

日期區間查找

因爲在數據庫內部使用了毫秒的方式儲存時間日期,那對於某一個日期,好比2015-07-21這一天的內容如何查找?

其實也就是查找2015-07-21 00:00:00到2015-07-22 00:00:00之間的數值,咱們造一個就是了。

首先,獲取當前時間

Date now = new Date();

將它處理:

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(now);
//能夠根據須要設置時區
//cal.setTimeZone(TimeZone.getDefault());
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
//毫秒可根據系統須要清除或不清除
cal.set(Calendar.MILLISECOND, 0);
long startTime = cal.getTimeInMillis();

結束時間加上便可:

long endTime = startTime + 24 * 3600 * 1000;

如今就能夠查詢了:

Cursor cursor = db.rawQuery("SELECT * FROM Journal WHERE 「 +
    」writeTime>=? and writeTime<?",
    new String[] { String.valueOf(startTime), String.valuesOf(endTime) });
相關文章
相關標籤/搜索