>  Q&A  >  본문

Room Java - 인터페이스에서 트랜잭션을 실행할 수 있습니까?

Android Studio 프로젝트에서 룸 프레임워크를 사용하고 있습니다. 인터페이스 내에서 트랜잭션을 생성하려고 합니다. 여기에서 문서를 읽었습니다: https://developer.android.com/reference/androidx/room/Transaction

인터페이스 대신 추상 클래스에서 트랜잭션을 생성해야 한다는 것을 알고 있습니다. 내 프로젝트에 이미 12개 이상의 인터페이스가 있고 이를 추상 클래스로 다시 작성하고 싶지 않기 때문에 이것이 가능한지 궁금합니다.

P粉852578075P粉852578075283일 전393

모든 응답(1)나는 대답할 것이다

  • P粉464208937

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

    인터페이스에서는 본문이 있는 메서드를 사용할 수 없기 때문에 하려는 작업이 인터페이스에서 불가능합니다.

    더 구체적으로 말하면 여러 문(UPDATE, 그 다음 DELETE)을 실행하려고 하지만 동시에 하나의 문만 실행할 수 있습니다.

    귀하의 옵션은 트리거를 정의하거나(트리거 내에서 가중치 행을 결정할 수 있는 경우 업데이트됨) 아마도 추상 클래스를 사용하여 함수를 사용하여 여러 명령문을 실행하거나 악용된 메소드(전달/또는 검색)를 사용하는 것입니다. (추상 클래스를 사용하는 것이 더 간단합니다).

    • 트리거가 필요한 경우 Room에서는 트리거 주석을 제공하지 않으므로 콜백을 사용하여 트리거를 만들어야 합니다.

    그런 다음 트랜잭션을 활용하려면 함수 앞에 더미 @Query가 있어야 합니다. 예를 들어

    으아아아
    • 참고 - 코드는 본질적으로 코드이며 컴파일, 실행 또는 테스트되지 않았으므로 일부 버그가 포함될 수 있습니다

    추가

    이 데모는 한 번만 실행되도록 설계되었으며 세 가지 방법을 모두 사용합니다.

    첫 번째는 @Entities입니다. 코드에서 사용 가능한 내용을 기반으로 하지만 날짜를 표시하기 위해 유형 변환기를 사용하는 대신 long을 사용했습니다.

    방문

    으아아아

    무게

    으아아아

    @Dao 일반 추상 메서드와 본문이 있는 메서드가 있는 주석이 달린 추상 클래스입니다(해결책 1). insert 메소드를 사용하면 일부 데이터(단 한 행)를 삽입할 수 있습니다.

    으아아아

    이제 @Database 주석이 달린 클래스(싱글톤 사용)는 좀 더 복잡해졌습니다.

    여기에는 트리거를 추가하는 콜백이 있습니다. 업데이트 후 삭제할 뿐만 아니라(아무 것도 삭제하지 않음) TRIGGER가 실제로 트리거되고 있음을 보여주는 액세스 테이블에 새 행을 추가하므로 트리거가 지나치게 복잡합니다(해결책 2). .

    또한 더 나은 이유로(또는 스타일/관행에 따라 다르지 않음) SupportSQLiteDatabase(솔루션 3)를 가져오고 사용하는 함수를 포함하세요.

    으아아아

    위 액티비티 코드 중 일부를 실제로 활용하려면MainActivity

    으아아아

    데모 결과 SppInspection을 통해

    예상대로 체중 테이블이 비어 있습니다 :-

    예상대로 액세스 테이블에는 4개의 행이 있습니다.-

    마지막으로 스키마(예: sqlite_master)는 트리거가 존재함을 보여줍니다(3줄을 추가해야 함):-

    회신하다
    0
  • 취소회신하다