Androidアプリ開発

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

この記事は約8分で読めます。
スポンサーリンク

こんにちは、まっさん(@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#などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

コメント欄