Androidアプリ開発

Room(SQLite)のINSERTで
自動採番されたシーケンスを取得する

この記事は約6分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

この記事のテーマ


Room(SQLite)の INSERT で自動採番されたシーケンスを取得する

ポイント

AndroidではRoomSQLite)というデータベースが使用できます。
データベースのテーブルで、プライマリキーを自動採番されたシーケンスとするケースが多々あります。
レコード追加後に自動採番されたプライマリーキーを取得する必要がある場合、DAOインタフェースの戻り値から取得可能です。

Room(SQLite) データベースの実装はこちらです↓↓↓

DAO(データアクセスオブジェクト)

Roomではクエリ式(@Query)でSQLを指定する方法とINSERTUPDATEDELETEなどはエンティティクラスにレコードをセットして更新する方法があります。

@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での開発を始めたい方へ

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

未経験者からシステムエンジニアを目指すのに最適かと、まずは無料相談から♪

未経験者からプログラマーを目指すのに最適かと、まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました