Android アプリ開発で、SQLite を使って日時を扱う時のポイント
- SQLite には日時を扱う型が無い。
- Android アプリでは 1970年1月1日 00:00:00.0 UTC からのミリ秒(Unix タイムのミリ秒)で日時を扱うことにする。
- UNIX タイムのミリ秒を INTEGER 型で挿入することにより SQLite で日時を扱う。(たとえばの方法。他にも考えられる。)
- Java で現在日時取得には、System.currentTimeMillis() を使用する。
- Java の Date クラス、SimpleDateFormat クラスなどで日時を扱う。
- 開発時にミリ秒の日時を得るのに便利なページ(「unix time」で検索して見つけた)
→ UNIXTIME相互変換ツール – konisimple
これがベストプラクティスかどうかはわかりません!今のところこれでアプリ制作が実現できている、という状態です。
大量のデータの挿入や検索時に問題が発生するかもしれません!けれども、ある程度綺麗に日時を扱えている感覚がございますのでメモしておきますわ♪
具体的な使い方
Android アプリ開発では、次のように使用しております。
【Java】基本的な考え方
- 全て 1970年1月1日 00:00:00.0 UTC からのミリ秒で扱う。
- 表示する場合のみ、ミリ秒から yyyy/MM/dd HH:mm などへ変換する。
【Java】現在日時の取得
Java では long で取得できますので、Long 型または long で扱うことといたします。
// 現在日時を取得 Long nowTime = System.currentTimeMillis();
【Java】ミリ秒から String の yyyy/MM/dd HH:mm への変換
メソッドで定義しておきますの。DateFormat はフィールドで定義し、クラスのどこからでも使用できるようにしておきますわ。
また、簡単に日付フォーマットに変換できるよう、ミリ秒を渡せばフォーマット済みの文字列が得られるように関数化しておきますの。
- SimpleDateFormat | Android Developers ← コンストラクタ
- SimpleDateFormat | Android Developers ← format メソッド
- Date | Android Developers ← コンストラクタ
static DateFormat yyyymmddhhmm = new SimpleDateFormat("yyyy/MM/dd HH:mm"); /** * Long の数字を日付フォーマットに変換します。 * @param date Long の数字 * @return "yyyy/MM/dd HH:mm" フォーマットの文字列 */ public static String convertLongToYyyymmddhhmm(Long date) { return yyyymmddhhmm.format(new Date(date)); }
この関数を、エンティティクラスから呼び出すようにいたします。
SELECT したデータをエンティティクラスに入れますけれども、そのエンティから表示データを得たいときなどに使用いたします。
【SQLite】カラムの型
- INTEGER 型でテーブルのカラムを定義する。
CREATE TABLE table_tests ( _id INTEGER PRIMARY KEY AUTOINCREMENT, create_date INTEGER )
最初、何かの参考書通りに LONG 型と書いていたのですけれども、SQLite の公式ドキュメントを読んでビックリ!!!LONG という型はございませんでした!!!!!
今まで CREATE TABLE に LONG と型定義をしており><、不思議なのはそれで問題なくうごいておりました。。。一体何なのかしら。。。TEXT または INTEGER に自動的に変換されていたのかしらね。
よく分からない型のまま、扱うのは原因不明の挙動の元となりますので、明示的に INTEGER 型に統一いたしました♪
補足。用語説明
UNIX タイム、Unix 時間とは、1970年1月1日0時0分0秒からの経過時間ですの。
おわりに
本投稿の内容は、少し検索すればわかるのですけれども、すぐ忘れてしまう内容ですの><。
行いたいことも実感しておりますし、プログラムの書き方の流れも理解しているけれども、実際どのように書くのか覚えていない、手が止まる、そんなことがよくございます><。
ですのでノートいたしましたわ♪
サンプルコードとしては、こちらも大変参考になりますの♪
以上です。
「【Android】日付を扱う Java と SQLite の考え方を整理」への1件の返信
[…] https://oki2a24.com/2015/04/19/use-date-with-java-with-sqlite-in-android/ https://www.sejuku.net/blog/20994 […]