Room Java - 인터페이스에서 트랜잭션을 실행할 수 있습니까?
P粉852578075
P粉852578075 2024-01-10 17:15:07
0
1
390

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

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

P粉852578075
P粉852578075

모든 응답(1)
P粉464208937

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

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

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

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

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

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

추가

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

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

방문

으아아아

무게

으아아아

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

으아아아

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

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

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

으아아아

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

으아아아

데모 결과 SppInspection을 통해

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

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

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!