Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android開発】SQLiteで日付と時刻の表示形式を変更する方法を徹底解説

AndroidのSQLiteデータベースとは?

本題に入る前に、まずAndroidにおけるSQLiteデータベースの基礎知識を確認しておきましょう。SQLiteは、端末上のテキストファイルにデータを格納するオープンソースのSQLデータベースエンジンです。Androidには標準でSQLiteの実装が組み込まれており、トランザクションやインデックスなど、リレーショナルデータベースの主要な機能をすべて利用できます。

また、JDBCやODBCのようにドライバを介した接続処理を確立する必要がなく、非常に軽量かつ手軽にデータベース操作を行える点も大きな魅力です。

この記事では、「AndroidのSQLiteで日付と時刻の表示形式を変更する方法」を、実際に動作するサンプルコードとともに段階的に解説していきます。

実装手順

ステップ1:Android Studioで新規プロジェクトを作成

Android Studioのメニューから「File」→「New Project」を選択し、必要な項目をすべて入力して新しいプロジェクトを作成します。

ステップ2:レイアウトファイル(activity_main.xml)の作成

次のコードを res/layout/activity_main.xml に追加してください。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:hint="Enter Name"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/salary"
android:layout_width="match_parent"
android:inputType="numberDecimal"
android:hint="Enter Salary"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"><Button
android:id="@+id/save"
android:text="Save"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/refresh"
android:text="Refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/udate"
android:text="Update"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/Delete"
android:text="DeleteALL"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>

このレイアウトでは、名前と給与を入力するためのEditTextを2つ配置し、「Save」「Refresh」「Update」「DeleteALL」の4つのボタンとListViewを用意しています。「Save」ボタンをタップすると入力内容がSQLiteデータベースに保存され、「Refresh」ボタンで登録済みデータの一覧をListViewに表示できます。

ステップ3:MainActivity.java の実装

続いて、次のコードを src/MainActivity.java に追加します。

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name, salary;
ArrayAdapter arrayAdapter;
private ListView listView;

@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllCotacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
findViewById(R.id.Delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (helper.delete()) {
Toast.makeText(MainActivity.this, "Deleted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Deleted", Toast.LENGTH_LONG).show();
}
}
});
findViewById(R.id.udate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.update(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Updated", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Updated",
Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});

findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
array_list.clear();
array_list.addAll(helper.getAllCotacts());
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.insert(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Inserted", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});
}
}

ステップ4:DatabaseHelper.java の実装

最後に、次のコードを src/DatabaseHelper.java に追加します。

package com.example.andy.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.IOException;
import java.util.ArrayList;

class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase6";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(
"create table " + CONTACTS_TABLE_NAME + "(id INTEGER PRIMARY KEY, name text,salary int,datetime default current_timestamp )"
);
} catch (SQLiteException e) {
try {
throw new IOException(e);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
onCreate(db);
}

public boolean insert(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();

ContentValues contentValues = new ContentValues();
contentValues.put("name", s);
contentValues.put("salary", s1);
db.replace(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}

public ArrayList getAllCotacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
Cursor res = db.rawQuery("select (id ||' : '||name || ' : ' || salary || ' : '|| strftime('%d-%m-%Y %H:%M:%S', datetime)) as fullname from " + CONTACTS_TABLE_NAME, null);
res.moveToFirst();

while (res.isAfterLast() == false) {
if ((res != null) && (res.getCount() > 0))
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
public boolean update(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + CONTACTS_TABLE_NAME + " SET name = " + "'" + s + "', " + "salary = " + "'" + s1 + "'");
return true;
}
public boolean delete() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from " + CONTACTS_TABLE_NAME);
return true;
}
}

ポイントはstrftime()関数による日時の書式指定

今回の記事の核となるのが、getAllCotacts() メソッド内のSQLクエリに含まれる strftime() 関数です。SQLiteのstrftime()関数を使えば、datetime型の値を任意の形式に整形して取得できます。

サンプルでは「%d-%m-%Y %H:%M:%S」という書式を指定しています。主な書式指定子は以下のとおりです。

  • %d … 日(01〜31)
  • %m … 月(01〜12)
  • %Y … 年(4桁)
  • %H … 時(00〜23)
  • %M … 分(00〜59)
  • %S … 秒(00〜59)

例えば「2022年3月31日 14時28分29秒」のデータは、「31-03-2022 14:28:29」という文字列として出力されます。書式指定子を組み替えれば、「YYYY-MM-DD」や日本式の「YYYY/MM/DD」形式など、自由にカスタマイズ可能です。

アプリの実行と動作確認

それではアプリケーションを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとします。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。実行デバイスとして自分のモバイル端末を選択すると、端末の画面にアプリが起動します。

【Android開発】SQLiteで日付と時刻の表示形式を変更する方法を徹底解説

上記の実行結果を見ると、SQLiteコマンド(strftime関数)で指定したとおりの日付・時刻形式でデータが一覧表示されていることが確認できます。名前・給与に加えて、登録日時も含めた形で各レコードが表示されていますね。

まとめ

AndroidのSQLiteで日付と時刻の形式を変更したい場合は、SELECT文の中でstrftime()関数を使うのが最もシンプルな方法です。テーブル定義時に datetime default current_timestamp を指定しておけば、レコード挿入時に自動的に現在日時が記録されるため、あとは表示側で好きな書式に整えるだけです。書式指定子を覚えておくとさまざまな場面で応用できるので、ぜひ実際のプロジェクトでも活用してみてください。

  1. Windows 11で日付と時刻を変更・設定する方法【初心者向けガイド】

    Windowsパソコンの日付と時刻は、通常インターネットに接続した時点で自動的に設定されます。ただし、必要に応じてこれらの設定を手動で変更することも可能です。この記事では、Windows 11で日付と時刻を変更するための手順をわかりやすく解説していきます。 Windows 11で日付と時刻を変更する方法 Windows 11で日付と時刻を変更するには、Windowsの「設定」アプリを使用します。まず、スタートメニューの検索バーに「設定」と入力し、表示された最適な結果を選択しましょう。あるいは、キーボードショートカットのWin + Iキーでも設定アプリを開くことができます。 設定アプリを開いたら

  2. 【Windows 10】日付と時刻の表示形式を変更する2つの方法をわかりやすく解説

    タスクバーに表示される日付と時刻は、初期設定では「月/日/年」の順(例:05/16/2018)、時刻は12時間表示(例:午後8:02)になっています。しかし、これらの表示形式を自分好みに変えたいと思ったことはありませんか?実は、Windows 10の「設定」または「コントロールパネル」から、いつでも好みの形式に変更できます。たとえば、「日/月/年」の順(例:16/05/2018)にしたり、時刻を24時間表示(例:21:02)にしたりすることも可能です。 日付と時刻にはそれぞれ多数の形式が用意されているため、目的に合ったものを選ぶことが大切です。「短い日付」「長い日付」「短い時刻」「長い時刻