>

행에서 가장 오래된 항목을 제거하고 최신 항목을 삽입하여Android 룸 데이터베이스의 행 수를 어떻게 제한 할 수 있습니까?

데이터베이스에 항목을 추가 할 때 표준 쿼리를 추측하고 있습니까?

편집 : 최대 행 개수가 20이되도록 데이터베이스 테이블을 제한하려고합니다.이 제한에 도달하면 가장 오래된 항목을 제거하고 현재 행 개수를 20으로 유지하여 새 항목을 삽입합니다.

  • 답변 # 1

    데이터를 테이블에 삽입 한 다음 마지막 20 (제한)을 제외한 모든 행을 제거 할 수 있다고 생각합니다

    삭제하려면 다음 쿼리를 사용할 수 있습니다

    와이즈 비즈 이 경우 id는 자동 증가로 설정된 기본 키입니다. 날짜별로 날짜를 저장하는 경우 날짜를 키로 사용할 수도 있습니다.

  • 답변 # 2

    다음은 샘플 솔루션입니다.

    질문은 :

    DELETE FROM tableName where id NOT IN (SELECT id from tableName ORDER BY id DESC LIMIT 20)

    여기서, 제한과 오프셋을 기준으로 사용자 목록을 제공합니다.

    와이즈 비츠 인 경우  테이블에서 처음 2 행을 반환합니다.

    와이즈 비츠 인 경우  테이블에서 두 번째와 세 번째 행을 반환합니다.

    그러나 @Query("SELECT * FROM user LIMIT :limit OFFSET :offset") User[] loadAllUsersByPage(int limit,int offset);  그런 다음 테이블에서 처음 10 행을 게재합니다.

  • 답변 # 3

    가정 :

    테이블은

    loadAllUsersByPage(2,0)
    
    

    일부 쿼리를 수동으로 실행하고 싶지는 않습니다.

    데이터베이스 트리거 사용 :

    loadAllUsersByPage(2,1)
    
    

    "무제한 오프셋"구문은이 답변에서 영감을 받았습니다.

    자바에서 트리거를 활성화하려면 :

    loadAllUsersByPage(-1,10) 를 재정의 할 수있는 간단한 Android :

    create table example_table (
      ts timestamp,
      uid number(19),
      some_other_field varchar(64)
    );
    
    

    Android Room 버전 :

    create trigger
      if not exists -- I don't actually know if you DB will support this line.
                    -- Might want to remove it if it's not.
    example_table_limiter
    on example_table
    after insert
    begin
      delete
      from example_table
      where ts in (
        select ts
        from example_table
        order by ts 
        limit -1 -- we don't want to limit how many rows we want to delete
        offset 25 -- but we want to offset query result so it leaves 25 rows in table
      );
    end;
    
    

  • 답변 # 4

    다음 단계를 따르십시오 :

    1>해당 테이블의 행 개수 가져 오기

    SQLiteOpenHelper
    
    

    2>가장 오래된 레코드를 얻는 것보다 카운트가>(보다 큼) 인 경우

    2

    public class DataBaseSchemaHelper extends SQLiteOpenHelper {
      @Override
      public void onCreate(SQLiteDatabase db) {     
        db.execSQL(<trigger string from above>);
      }
    }
    
    

    3>이제 선택된 레코드를 삭제하십시오

    4>새로운 데이터 삽입

    참고 : 루프에 넣는 것보다 여러 항목을 삽입하는 경우

    public MyDatabase extends RoomDatabase { @Override public void init(DatabaseConfiguration _config) { super.init(_config); getOpenHelper().getWritableDatabase().execSQL(<trigger string from above>); } }

  • 이전 assembly - Opcode를 통해 ModR/M이 필요한지 확인하는 방법은 무엇입니까?
  • 다음 python - Pygoocanvas에 이미지 추가