RoomとContentProviderでさらに便利に!Androidアプリ開発におけるSQLiteデータベース活用術
AndroidでSQLiteデータベースを作成する方法
まず、SQLiteOpenHelperを継承したクラスを作成する必要があります。このクラスは、データベースのオープン、クローズ、バージョン管理などの基本的な操作を処理します。
public class MyDatabaseHelper extends SQLiteOpenHelper {
// データベース名
private static final String DATABASE_NAME = "mydatabase.db";
// データベースバージョン
private static final int DATABASE_VERSION = 1;
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) {
// データベースバージョン更新時に実行する処理
// 例:古いテーブルの削除、新しいテーブルの作成
db.execSQL("DROP TABLE IF EXISTS mytable");
onCreate(db);
}
}
データベースを開くには、MyDatabaseHelperクラスのインスタンスを取得し、getWritableDatabase()メソッドを呼び出します。
MyDatabaseHelper helper = new MyDatabaseHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
テーブルを作成する
データベースを開いたら、テーブルを作成する必要があります。CREATE TABLEステートメントを使用して、テーブル名、列名、データ型などを定義します。
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
データを挿入する
INSERT INTOステートメントを使用して、データレコードをテーブルに挿入します。
db.execSQL("INSERT INTO mytable (name, age) VALUES (?, ?)", new String[] {"Alice", 30});
SELECTステートメントを使用して、テーブルからデータを取得します。
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();
データベースを使用が終わったら、必ずclose()メソッドを呼び出してデータベースを閉じます。
db.close();
その他
- トランザクション処理
- カーソルアダプタ
- 外部キー制約
- インデックス
上記以外にも、SQLiteデータベースには様々な機能があります。詳細は、Android公式ドキュメントや書籍などを参照してください。
補足
- 上記はあくまでも基本的な例です。具体的な実装は、アプリの要件に合わせて変更する必要があります。
- エラー処理やセキュリティ対策も忘れずに行うようにしましょう。
public class MyActivity extends Activity {
private MyDatabaseHelper helper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// データベースヘルパーのインスタンスを取得
helper = new MyDatabaseHelper(this);
// データベースを開く
db = helper.getWritableDatabase();
}
public void onClickButtonInsert(View view) {
// データを挿入
db.execSQL("INSERT INTO mytable (name, age) VALUES (?, ?)", new String[] {"Bob", 25});
}
public void onClickButtonSelect(View view) {
// データを取得
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();
}
}
public class MyDatabaseHelper extends SQLiteOpenHelper {
// データベース名
private static final String DATABASE_NAME = "mydatabase.db";
// データベースバージョン
private static final int DATABASE_VERSION = 1;
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) {
// データベースバージョン更新時に実行する処理
// 例:古いテーブルの削除、新しいテーブルの作成
db.execSQL("DROP TABLE IF EXISTS mytable");
onCreate(db);
}
}
説明
MyActivity
クラスは、ボタンクリック時の処理を定義しています。onClickButtonInsert
メソッドは、データベースにデータレコードを挿入します。
MyDatabaseHelper
クラスは、SQLiteOpenHelperを継承したクラスです。onCreate
メソッドは、データベースが初めて作成されたときに実行されます。このメソッド内で、テーブルの作成などの処理を行います。
使い方
- 上記のコードをプロジェクトにコピーします。
MyActivity
クラスとMyDatabaseHelper
クラスの名前を変更します。- 必要に応じて、コードをアプリの要件に合わせて変更します。
- アプリを実行します。
このサンプルコードを参考に、自分のアプリでSQLiteデータベースを活用してください。
AndroidでSQLiteデータベースを作成するその他の方法
Roomを使う
Roomは、AndroidでSQLiteデータベースを操作するためのライブラリです。Roomを使うと、データベース操作のコードをより簡潔に記述することができます。
@Database(entities = {MyEntity.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
public abstract MyDao myDao();
@Override
public abstract void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
}
@Override
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースバージョン更新時の処理
}
public static MyDatabase getInstance(Context context) {
return Room.databaseBuilder(context, MyDatabase.class, "mydatabase.db")
.build();
}
}
@Dao
public interface MyDao {
@Insert
void insert(MyEntity entity);
@Query("SELECT * FROM mytable")
List<MyEntity> getAll();
}
public class MyEntity {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int age;
// getter/setter
}
ContentProviderは、他のアプリからデータベースにアクセスするための仕組みです。ContentProviderを使うと、他のアプリから直接データベースにアクセスすることができるようになります。
public class MyContentProvider extends ContentProvider {
private static final String AUTHORITY = "com.example.myapp";
private static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + MyContract.TABLE_NAME);
private MyDatabaseHelper helper;
@Override
public boolean onCreate() {
helper = new MyDatabaseHelper(getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// データを挿入
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert(MyContract.TABLE_NAME, null, values);
if (id != -1) {
return CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).build();
} else {
return null;
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// データを取得
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query(MyContract.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), CONTENT_URI);
return cursor;
}
// ...
}
AndroidでSQLiteデータベースを作成するには、様々な方法があります。自分に合った方法を選択して、アプリ開発を進めてください。
android database sqlite