SQLiteOpenHelperでデータベースを操作しよう!基本操作から詳細まで
AndroidでSQLiteデータベースを保存する方法
このチュートリアルでは、AndroidでSQLiteデータベースを保存する方法を、次のトピックに分けてわかりやすく説明します。
SQLiteOpenHelperクラス
SQLiteデータベースを操作するには、SQLiteOpenHelperクラスを使用します。このクラスは、データベースの作成、接続、開閉などの基本的な機能を提供します。
データベースの作成
データベースを作成するには、onCreate()
メソッドをオーバーライドする必要があります。このメソッド内で、CREATE TABLE
ステートメントを使用してデータベースのテーブルを作成します。
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "mydatabase.db";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
}
// ...
}
データへのアクセス
データベースにアクセスするには、SQLiteDatabase
インスタンスを取得する必要があります。このインスタンスを使用して、クエリを実行したり、データを挿入したり、更新したり、削除したりできます。
MyDatabaseHelper helper = new MyDatabaseHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
// データの挿入
db.execSQL("INSERT INTO mytable (name, age) VALUES (?, ?)", new String[] {"Alice", "30"});
// データの読み取り
Cursor cursor = db.rawQuery("SELECT * FROM mytable", null);
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
Log.d("TAG", "id: " + id + ", name: " + name + ", age: " + age);
}
cursor.close();
// データの更新
db.execSQL("UPDATE mytable SET age = 31 WHERE name = ?", new String[] {"Alice"});
// データの削除
db.execSQL("DELETE FROM mytable WHERE id = ?", new String[] {"1"});
db.close();
データベースの保存場所
Androidでは、SQLiteデータベースはアプリの内部ストレージに保存されます。他のアプリからはアクセスできないため、アプリ固有のデータを保存するのに適しています。
データベースファイルの場所は次のとおりです。
/data/data/<app_package_name>/databases/<database_name>
たとえば、com.example.myapp
というパッケージ名のアプリの場合、データベースファイルの場所は次のようになります。
/data/data/com.example.myapp/databases/mydatabase.db
注意点
- データベースへのアクセスは常にスレッドセーフにする必要があります。
- データベースを頻繁に読み書きする場合は、パフォーマンスを向上させるためにインデックスを作成する必要があります。
- アプリをアンインストールすると、内部ストレージにあるデータベースファイルも削除されます。
package com.example.myapp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "mydatabase.db";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースのスキーマが変更された場合の処理
}
public void insertData(String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
db.insert("mytable", null, values);
db.close();
}
public Cursor readData() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM mytable", null);
return cursor;
}
public void updateData(int id, String name, int age) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
db.update("mytable", values, "id = ?", new String[]{String.valueOf(id)});
db.close();
}
public void deleteData(int id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete("mytable", "id = ?", new String[]{String.valueOf(id)});
db.close();
}
}
使用方法
MyDatabaseHelper
クラスをインスタンス化します。insertData()
メソッドを使用して、データベースにデータを挿入します。
例
MyDatabaseHelper helper = new MyDatabaseHelper(this);
// データの挿入
helper.insertData("Alice", 30);
// データの読み取り
Cursor cursor = helper.readData();
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
Log.d("TAG", "id: " + id + ", name: " + name + ", age: " + age);
}
cursor.close();
// データの更新
helper.updateData(1, "Alice", 31);
// データの削除
helper.deleteData(2);
- 内部ストレージ(上記で説明した方法)
- 外部ストレージ
- クラウドストレージ
- NoSQLデータベース
内部ストレージ
内部ストレージは、アプリ専用に割り当てられたプライベートなストレージ領域です。他のアプリからはアクセスできないため、アプリ固有のデータを保存するのに適しています。SQLiteデータベースを内部ストレージに保存する方法は、上記で説明したとおりです。
外部ストレージは、SDカードなどのリムーバブルメディアを指します。内部ストレージよりも容量が大きいため、大量のデータを保存する場合に適しています。ただし、ユーザーがSDカードを削除すると、データも失われる可能性があることに注意する必要があります。
SQLiteデータベースを外部ストレージに保存するには、**getExternalStorageDirectory()`メソッドを使用してSDカードのルートパスを取得し、そのパスを使用してデータベースファイルを作成します。
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/mydatabase.db";
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(path, null);
クラウドストレージは、インターネット経由でアクセスできるリモートストレージサービスです。Firebase Realtime DatabaseやCloud Storageなどのサービスを利用して、SQLiteデータベースをクラウドストレージに保存できます。
クラウドストレージを使用する利点は、データベースにどこからでもアクセスできることです。また、複数のデバイス間でデータを同期することもできます。
NoSQLデータベースは、構造化されていないデータの保存に適したデータベースです。JSONやBSONなどの形式でデータを保存します。
NoSQLデータベースは、スケーラビリティと柔軟性に優れていますが、SQLiteデータベースほどクエリのパフォーマンスが優れていない場合があります。
どの方法を選択すべきか
どの方法を選択するかは、アプリの要件によって異なります。
- データを他のアプリからアクセスできないようにする必要がある場合は、内部ストレージを使用します。
- 大量のデータを保存する必要がある場合は、外部ストレージを使用します。
- データにどこからでもアクセスできる必要がある場合は、クラウドストレージを使用します。
- 構造化されていないデータを保存する必要がある場合は、NoSQLデータベースを使用します。
以下は、各方法の利点と欠点の表です。
方法 | 利点 | 欠点 |
---|---|---|
内部ストレージ | 安全、他のアプリからアクセスできない | 容量が小さい |
外部ストレージ | 容量が大きい | ユーザーが削除できる、パフォーマンスが遅い |
クラウドストレージ | どこからでもアクセスできる、複数のデバイス間で同期できる | インターネット接続が必要、セキュリティ上のリスクがある |
NoSQLデータベース | スケーラブル、柔軟性がある | クエリのパフォーマンスが低い |
android sqlite