Android SQLite チュートリアル:データの保存と読み取り
Android SQLite 例:データの保存と読み取り
このチュートリアルでは、Android SQLite の基本的な操作を例示します。
データベースの作成
まず、データベースを作成する必要があります。これには、SQLiteDatabase
クラスを使用します。
public class DatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "my_database.db";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースのアップグレード処理
}
}
このコードは、my_table
という名前のテーブルを作成します。このテーブルには、id
(自動的に増分される主キー)、name
(テキスト)、email
(テキスト) という 3 つの列があります。
データの挿入
データをデータベースに挿入するには、ContentValues
オブジェクトを使用して値を格納し、insert()
メソッドを使用します。
ContentValues values = new ContentValues();
values.put("name", "John Doe");
values.put("email", "[email protected]");
long newRowId = db.insert("my_table", null, values);
このコードは、name
に "John Doe"、email
に "[email protected]" という値を持つ新しい行を my_table
テーブルに挿入します。
データの読み取り
データをデータベースから読み取るには、Cursor
オブジェクトを使用します。
String[] columns = {"id", "name", "email"};
Cursor cursor = db.query("my_table", columns, null, null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
String email = cursor.getString(2);
Log.d("TAG", "id: " + id + ", name: " + name + ", email: " + email);
}
cursor.close();
このコードは、my_table
テーブル内のすべての行を読み取り、コンソールにログ出力します。
データを更新するには、update()
メソッドを使用します。
ContentValues values = new ContentValues();
values.put("name", "Jane Doe");
String selection = "id = ?";
String[] selectionArgs = {"1"};
int rowsUpdated = db.update("my_table", values, selection, selectionArgs);
このコードは、id
が 1 の行の name
を "Jane Doe" に更新します。
String selection = "id = ?";
String[] selectionArgs = {"1"};
int rowsDeleted = db.delete("my_table", selection, selectionArgs);
このコードは、id
が 1 の行を my_table
テーブルから削除します。
このチュートリアルは、Android SQLite の基本的な操作について説明しました。より高度な操作については、Android 開発者ドキュメントを参照してください。
補足
- この例は、データベース操作の基本的な概要を示しています。実際のアプリケーションでは、エラー処理、トランザクション、パフォーマンスの最適化など、より多くの考慮事項が必要になる場合があります。
- データベースへのアクセスは、メインスレッドではなくバックグラウンドスレッドで行う必要があります。
- データベースのセキュリティは重要です。アプリケーションで機密情報を保存する場合は、適切な暗号化と認証メカニズムを使用してください。
Android SQLite サンプルコード
前回の説明では、Android SQLite の基本的な操作について概要を説明しました。
今回は、より具体的なサンプルコードを提供することで、理解を深めていただきたいと思います。
データベースの作成とテーブルの作成
public class DatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "my_database.db";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースのアップグレード処理
}
}
このコードは、my_database.db
という名前のデータベースと、my_table
という名前のテーブルを作成します。
public void insertData(String name, String email) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("email", email);
long newRowId = db.insert("my_table", null, values);
Log.d("TAG", "New row inserted with ID: " + newRowId);
db.close();
}
このコードは、name
と email
を引数として受け取り、それらの値を my_table
テーブルに挿入します。
public Cursor readAllData() {
SQLiteDatabase db = getReadableDatabase();
String[] columns = {"id", "name", "email"};
Cursor cursor = db.query("my_table", columns, null, null, null, null, null);
return cursor;
}
public void updateData(int id, String newName, String newEmail) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", newName);
values.put("email", newEmail);
String selection = "id = ?";
String[] selectionArgs = {String.valueOf(id)};
int rowsUpdated = db.update("my_table", values, selection, selectionArgs);
Log.d("TAG", "Rows updated: " + rowsUpdated);
db.close();
}
public void deleteData(int id) {
SQLiteDatabase db = getWritableDatabase();
String selection = "id = ?";
String[] selectionArgs = {String.valueOf(id)};
int rowsDeleted = db.delete("my_table", selection, selectionArgs);
Log.d("TAG", "Rows deleted: " + rowsDeleted);
db.close();
}
使用方法
上記のコードを使用するには、以下の手順に従ってください。
DatabaseHelper
クラスをプロジェクトに追加します。insertData()
,readAllData()
,updateData()
,deleteData()
などのメソッドを呼び出して、データベース操作を実行します。
例
DatabaseHelper helper = new DatabaseHelper(this);
// データを挿入
helper.insertData("John Doe", "[email protected]");
// すべてのデータを読み取る
Cursor cursor = helper.readAllData();
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
String email = cursor.getString(2);
Log.d("TAG", "id: " + id + ", name: " + name + ", email: " + email);
}
cursor.close();
// データを更新
helper.updateData(1, "Jane Doe", "[email protected]");
// データを削除
helper.deleteData(2);
この例では、DatabaseHelper
オブジェクトを作成し
Android SQLite:代替アプローチ
Room Persistence Library
Room は、SQLite データベースとのやり取りを簡素化するためのライブラリです。 データベース操作を抽象化し、コードをより簡潔で読みやすく、保守しやすくします。
利点:
- コードを簡潔にする
- 型安全性を向上させる
- コルラウチンと LiveData をサポート
- コンパイル時のチェック
- 習得に時間がかかる
- アプリケーションの複雑さを増す可能性がある
例:
@Dao
public interface UserDao {
@Insert
void insertUser(User user);
@Query("SELECT * FROM users")
List<User> getAllUsers();
@Update
void updateUser(User user);
@Delete
void deleteUser(User user);
}
Content Providers は、他のアプリケーション間でデータを共有するためのメカニズムです。 SQLite データベースへのアクセスを提供するために使用できます。
- アプリケーション間でデータを共有できる
- データベースへのアクセスをカプセル化できる
- セキュリティを強化できる
- 複雑さ
- 設定と実装に時間がかかる
public class MyContentProvider extends ContentProvider {
private static final String AUTHORITY = "com.example.myprovider";
private static final String TABLE_NAME = "my_table";
@Override
public Uri insert(Uri uri, ContentValues values) {
// データを挿入
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// データを読み取る
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// データを更新
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// データを削除
return 0;
}
@Override
public String getType(Uri uri) {
// コンテンツの種類を返す
return null;
}
}
Realm は、モバイルアプリケーション用のオープンソースのクロスプラットフォームデータベースです。 オブジェクト指向インターフェースを提供し、SQLite よりも高速で柔軟なデータアクセスを提供します。
- 高速
- 柔軟性
- オブジェクト指向
- オフライン対応
- ライブラリのサイズが大きい
- 相対的に新しいテクノロジー
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
User user = realm.createObject(User.class);
user.setName("John Doe");
user.setEmail("[email protected]");
realm.commitTransaction();
// データを読み取る
User retrievedUser = realm.where(User.class).equalTo("name", "John Doe").findFirst();
// データを更新
retrievedUser.setEmail("[email protected]");
realm.close();
Firebase Realtime Database は、NoSQL データベースであり、クラウドベースのリアルタイムデータ同期を提供します。 モバイルおよび Web アプリケーションでよく使用されます。
- リアルタイムデータ同期
- スケーラブル
- データプライバシーに関する懸念
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference = database.getReference("users");
// データを挿入
String key = reference.push().getKey();
User user = new User("John Doe", "[email protected]");
reference.child(key).setValue(user);
// データを読み取る
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
Log.d("TAG", "User: " + user);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("TAG", "Failed to load user.", databaseError.toException());
}
};
reference.addValueEventListener(listener);
// データを更新
reference.child(key).child("email").setValue("janedoe@
android database sqlite