こんにちは、まっさん(@Tera_Msaki)です。
この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)
◎テーマ
Androidスマホのアプリ開発でRoom(SQLite)の INSERT で自動採番されたシーケンスを取得する
◎ポイント
AndroidアプリではRoom(SQLite)というデータベースが使用できます。
データベースのテーブルで、プライマリキーを自動採番されたシーケンスとするケースが多々あります。
Roomでレコード追加(INSERT)の直後に自動採番されたプライマリーキーを取得する必要がある場合、DAOインタフェースの戻り値から取得可能です。
◎Roomで使用するDAO(データアクセスオブジェクト)
Roomではクエリ式(@Query)でSQLを指定する方法とINSERT、UPDATE、DELETEなどはエンティティクラスにレコードをセットして更新する方法があります。
@Dao
public interface ShopDao {
:
// INSERT
@Insert(onConflict = OnConflictStrategy.IGNORE)
long insert(Shop shop);
// UPDATE
@Update(onConflict = OnConflictStrategy.REPLACE)
void update(Shop shop);
INSERT で自動採番されたシーケンスを取得するために、戻り値をlongで定義します。
◎データベースの更新処理を実装する
AndroidでRoomを使う場合、UIスレッドとは別のスレッドで実行する必要があります。
実行結果は Handler を使って、フックします。
プライマリキーを自動採番する利点としては、データベースが一意性を担保してくれることです。
この為、明示的に追加か更新が制御できます。
エンティティのプライマリキーを null に設定することで追加(INSERT)か更新(UPDATE)を判断しています。
private static final boolean DEBUG = true;
private static final String TAG = StockerDatabaseHelper.class.getSimpleName();
private final Handler handler = new Handler(Looper.getMainLooper());
private Map<Integer,String> shop = new HashMap<>();
private long sequence;
:
public void updateShop(Shop shop, String keywords) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
if (shop.sSeq == null)
sequence = shopDao.insert(shop);
else
shopDao.update(shop);
} catch (Exception e) {
Log.d(TAG, String.format("updateShop:%s", e.getMessage()));
e.printStackTrace();
}
handler.post(() -> {
if (shop.sSeq == null)
shop.sSeq = (int)sequence;
if (DEBUG) Log.d(TAG, String.format("updateShop:%d", shop.sSeq));
setSName(shop.sSeq, shop.sName);
getShops(keywords);
});
});
}
実行結果の引き渡したエンティティのプライマリキーは null のままなので、戻り値の自動採番されたシーケンスを設定します。
サンプルでは、setSName でアプリの内部処理でプライマリキーと名称を扱うための Map を作成し、getShops でレコード追加後のリスト(keywords は検索フィルタ)を作成しています。

◎これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
初めてのAndroidのアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、JavaやC#などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。



コメント欄