ホームページ  >  に質問  >  本文

Room Java - インターフェースでトランザクションを実行することは可能ですか?

Android Studio プロジェクトでルーム フレームワークを使用しています。インターフェイス内でトランザクションを作成しようとしています。ここからドキュメントを読みました: https://developer.android.com/reference/androidx/room/Transaction

トランザクションはインターフェイスではなく抽象クラスで作成する必要があることはわかっています。私のプロジェクトにはすでに十数個のインターフェイスがあり、それらを抽象クラスとして書き換えたくないので、これが可能かどうか疑問に思っています。

P粉852578075P粉852578075283日前392

全員に返信(1)返信します

  • P粉464208937

    P粉4642089372024-01-11 13:32:33

    インターフェイスでは本体を持つメソッドを使用できないため、あなたがやろうとしていることはインターフェイスでは不可能です。

    より具体的には、複数のステートメント (UPDATE、次に DELETE) を実行しようとしていますが、一度に実行できるステートメントは 1 つだけです。

    オプションは、トリガーを定義する (トリガー内から重み行を決定できる場合は更新される) か、おそらく抽象クラスを使用して、関数を使用して複数のステートメントを実行するか、エクスプロイト メソッド (pass / または) を使用することです。取得) SupportSQliteDatabase (抽象クラスを使用する方が簡単です)。

    • Room はトリガーの注釈を提供しないため、トリガーが必要な場合は、コールバックを使用してトリガーを作成する必要があります。

    次に、トランザクションを利用するには、関数の前にダミーの @Query を置きます。例えば### リーリー

    • 注 - コードは本質的にコードであり、コンパイル、実行、テストが行​​われていないため、いくつかのエラーが含まれる可能性があります
    • ######追加######
    これは、3 つの方法すべてを使用する、一度だけ実行するように設計された実際のデモです。

    最初は @Entities

    で、コード内で利用可能なものに基づいていますが、日付を表すために (型コンバーターを使用する代わりに)long を使用しています。

    ######アクセス###### リーリー ######重さ###### リーリー

    @Dao 通常の抽象メソッドと本体を持つメソッドを含む注釈付き抽象クラス (解決策 1)。 insert メソッドを使用すると、データ (1 行のみ) を挿入できます。 リーリー

    さて、

    @Database アノテーション付きクラス (シングルトンを使用) はもう少し複雑です。

    これにはトリガーを追加するコールバックがあります。トリガーは更新後に削除する (何も削除しない) だけでなく、TRIGGER が実際にトリガーされていることを示す新しい行をアクセス テーブルに追加するため、非常に複雑です (解決策 2)。

    また、より良い場所が必要なため (またはスタイル/実践に応じて)、SupportSQLiteDatabase を取得して使用する関数を含めます (解決策 3) リーリー

    上記のアクティビティ コードの一部を実際に利用するには

    MainActivity リーリー

    デモ結果 SppInspection 著

    予想通り、重みテーブルは空です: -

    予想どおり、アクセス テーブルには 4 つの行があります: -

    最後に、スキーマ (つまり sqlite_master) はトリガーが存在することを示しています (さらに 3 行を追加する必要がありました): -

    返事
    0
  • キャンセル返事