Android Studio 프로젝트에서 룸 프레임워크를 사용하고 있습니다. 인터페이스 내에서 트랜잭션을 생성하려고 합니다. 여기에서 문서를 읽었습니다: https://developer.android.com/reference/androidx/room/Transaction
인터페이스 대신 추상 클래스에서 트랜잭션을 생성해야 한다는 것을 알고 있습니다. 내 프로젝트에 이미 12개 이상의 인터페이스가 있고 이를 추상 클래스로 다시 작성하고 싶지 않기 때문에 이것이 가능한지 궁금합니다.
인터페이스에서는 본문이 있는 메서드를 사용할 수 없기 때문에 하려는 작업이 인터페이스에서 불가능합니다.
더 구체적으로 말하면 여러 문(UPDATE, 그 다음 DELETE)을 실행하려고 하지만 동시에 하나의 문만 실행할 수 있습니다.
귀하의 옵션은 트리거를 정의하거나(트리거 내에서 가중치 행을 결정할 수 있는 경우 업데이트됨) 아마도 추상 클래스를 사용하여 함수를 사용하여 여러 명령문을 실행하거나 악용된 메소드(전달/또는 검색)를 사용하는 것입니다. (추상 클래스를 사용하는 것이 더 간단합니다).
그런 다음 트랜잭션을 활용하려면 함수 앞에 더미 @Query가 있어야 합니다. 예를 들어
으아아아추가
이 데모는 한 번만 실행되도록 설계되었으며 세 가지 방법을 모두 사용합니다.
첫 번째는
@Entities
입니다. 코드에서 사용 가능한 내용을 기반으로 하지만 날짜를 표시하기 위해 유형 변환기를 사용하는 대신 long을 사용했습니다.방문
으아아아무게
으아아아
으아아아@Dao
일반 추상 메서드와 본문이 있는 메서드가 있는 주석이 달린 추상 클래스입니다(해결책 1). insert 메소드를 사용하면 일부 데이터(단 한 행)를 삽입할 수 있습니다.이제
@Database
주석이 달린 클래스(싱글톤 사용)는 좀 더 복잡해졌습니다.여기에는 트리거를 추가하는 콜백이 있습니다. 업데이트 후 삭제할 뿐만 아니라(아무 것도 삭제하지 않음) TRIGGER가 실제로 트리거되고 있음을 보여주는 액세스 테이블에 새 행을 추가하므로 트리거가 지나치게 복잡합니다(해결책 2). .
또한 더 나은 이유로(또는 스타일/관행에 따라 다르지 않음) SupportSQLiteDatabase(솔루션 3)를 가져오고 사용하는 함수를 포함하세요.
으아아아위 액티비티 코드 중 일부를 실제로 활용하려면MainActivity
으아아아데모 결과 SppInspection을 통해
예상대로 체중 테이블이 비어 있습니다 :-
예상대로 액세스 테이블에는 4개의 행이 있습니다.-
마지막으로 스키마(예: sqlite_master)는 트리거가 존재함을 보여줍니다(3줄을 추가해야 함):-