Android Studio プロジェクトでルーム フレームワークを使用しています。インターフェイス内でトランザクションを作成しようとしています。ここからドキュメントを読みました: https://developer.android.com/reference/androidx/room/Transaction
トランザクションはインターフェイスではなく抽象クラスで作成する必要があることはわかっています。私のプロジェクトにはすでに十数個のインターフェイスがあり、それらを抽象クラスとして書き換えたくないので、これが可能かどうか疑問に思っています。
P粉4642089372024-01-11 13:32:33
インターフェイスでは本体を持つメソッドを使用できないため、あなたがやろうとしていることはインターフェイスでは不可能です。
より具体的には、複数のステートメント (UPDATE、次に DELETE) を実行しようとしていますが、一度に実行できるステートメントは 1 つだけです。
オプションは、トリガーを定義する (トリガー内から重み行を決定できる場合は更新される) か、おそらく抽象クラスを使用して、関数を使用して複数のステートメントを実行するか、エクスプロイト メソッド (pass / または) を使用することです。取得) SupportSQliteDatabase (抽象クラスを使用する方が簡単です)。
次に、トランザクションを利用するには、関数の前にダミーの @Query を置きます。例えば### リーリー
最初は @Entities
で、コード内で利用可能なものに基づいていますが、日付を表すために (型コンバーターを使用する代わりに)long を使用しています。######アクセス###### リーリー ######重さ###### リーリー
@Dao 通常の抽象メソッドと本体を持つメソッドを含む注釈付き抽象クラス (解決策 1)。 insert メソッドを使用すると、データ (1 行のみ) を挿入できます。
リーリー
@Database アノテーション付きクラス (シングルトンを使用) はもう少し複雑です。
これにはトリガーを追加するコールバックがあります。トリガーは更新後に削除する (何も削除しない) だけでなく、TRIGGER が実際にトリガーされていることを示す新しい行をアクセス テーブルに追加するため、非常に複雑です (解決策 2)。また、より良い場所が必要なため (またはスタイル/実践に応じて)、SupportSQLiteDatabase を取得して使用する関数を含めます (解決策 3) リーリー
上記のアクティビティ コードの一部を実際に利用するにはMainActivity
リーリー
デモ結果
SppInspection 著
予想通り、重みテーブルは空です: -
予想どおり、アクセス テーブルには 4 つの行があります: -
最後に、スキーマ (つまり sqlite_master) はトリガーが存在することを示しています (さらに 3 行を追加する必要がありました): -