Realm 이동 경량급 데이터베이스 프레임 워 크

10855 단어
우선 여러분 은 SQLiteOpenHelper 라 는 유형 에 대해 낯 설 지 않 습 니 다. 당신 과 함께 DAO 류 는 IMPL 실현 류 를 포함 합 니 다!
SQLiteOpenHelper 는 생 성 표 데이터베이스 업그레이드, 데이터베이스 암호 화, 데이터 의 첨삭 검사 등 과 관련된다.sqllite 의 다 중 표 연결 왼쪽 링크 등등
데이터베이스 Realm, sqlite 를 대체 하 는 솔 루 션 입 니 다!
이것 은 자신의 데이터베이스 저장 엔진 을 가지 고 sqlite 보다 경량급 이 며 빠 른 속 도 를 가 집 니 다. 또한 JSON, 스 트림 api, 데이터 변경 알림, 자동 데이터 동기 화, 간단 한 인증, 방문 제어, 사건 처 리 를 지원 합 니 다. 가장 중요 한 것 은 크로스 플랫폼 입 니 다. 현재 자바, Objective C, Swift, React - Native 가 있 습 니 다.Xamarin 이라는 다섯 가지 실현 은 있 지만 그 도 자신의 단점 이 있다. 예 를 들 어 더 이상 조사 할 수 없다 는 것 이다.
하지만 우 리 는 주로 유행 하 는 Realm 프레임 워 크 를 어떻게 사용 하 는 지 이야기 합 니 다!
환경 설정
  • 프로젝트 의 build 파일 에
  • buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath "io.realm:realm-gradle-plugin:2.0.2"
        }
    }
    
  • app 의 build 파일 에
  • apply plugin: 'realm-android'
    
  • application 사용자 정의 설정. schemaVersion (1) 버 전 번 호 를 설정 합 니 다. 설정 되 지 않 으 면 기본 값 은 0. encryptionKey () 데이터베이스 암호 화. deleteRealmIfMigration Needed () 이전 방안 의 하나 입 니 다. 데이터베이스 구조 가 바 뀌 었 을 때 원래 데이터 라 이브 러 리 에 있 는 모든 데 이 터 를 삭제 합 니 다. 이것 은 debug 버 전에 서 매우 유용 합 니 다. 응용 프로그램 이 출시 되면,원 데이터 데 이 터 를 보존 해 야 한다 면 이 방안 은 적용 되 지 않 는 다.migration () 은 이전 방안 을 지정 합 니 다. 만약 에 온라인 으로 응용 한 후에 데이터 베이스 구조 가 바 뀌 어야 한다 면 Migration 설정 을 통 해 해결 할 수 있 습 니 다. 원 데이터 베 이 스 를 새로운 데이터 베이스 로 옮 길 수 있 습 니 다.
  • public class MyApplication extends Application {
      @Override
      public void onCreate() {
        super.onCreate();
        Realm.init(this);
        RealmConfiguration config = new  RealmConfiguration.Builder()
                                             .name("myRealm.realm")
                                             .deleteRealmIfMigrationNeeded()
                                             .build();
        Realm.setDefaultConfiguration(config);
      }
    }
    
  • 실체 만 들 기
  • public class Dog extends RealmObject {
        private String name;
        private int age;
    
        @PrimaryKey
        private String id;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    }
    

    더 내 려 가면 저희 가 첨삭 하고 고 치 는 용법 을 말씀 드 리 겠 습 니 다.
  • 증가
  • (1) 실현 방법 1: 사무 조작
    형식 1: 대상 을 새로 만 들 고 저장 합 니 다.
    Realm realm=Realm.getDefaultInstance();
    
    realm.beginTransaction();
    User user = realm.createObject(User.class); // Create a new object
    user.setName("John");
    user.setEmail("[email protected]");
    realm.commitTransaction();
    
    

    형식 2: Realm 데이터베이스 에 대상 복사
    Realm realm=Realm.getDefaultInstance();
    
    User user = new User("John");
    user.setEmail("[email protected]");
    
    // Copy the object to Realm. Any further changes must happen on realmUser
    realm.beginTransaction();
    realm.copyToRealm(user);
    realm.commitTransaction();
    

    (2) 실현 방법 2: 트 랜 잭 션 블록 사용
    Realm  mRealm=Realm.getDefaultInstance();
    
    final User user = new User("John");
    user.setEmail("[email protected]");
    
    mRealm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
    
                realm.copyToRealm(user);
    
                }
            });
    
  • 삭제 역시 같은 beginTransaction 과 commitTransaction 방법 으로 삭제 할 수 있다
  •  Realm  mRealm=Realm.getDefaultInstance();
    
        final RealmResults dogs=  mRealm.where(Dog.class).findAll();
    
            mRealm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
    
                    Dog dog=dogs.get(5);
                    dog.deleteFromRealm();
                    //       
                    dogs.deleteFirstFromRealm();
                    //        
                    dogs.deleteLastFromRealm();
                    //     1   
                    dogs.deleteFromRealm(1);
                    //      
                    dogs.deleteAllFromRealm();
                }
            });
    
  • 고 쳐 도 사물 블록 으로 데 이 터 를 업데이트 할 수 있다
  • Realm  mRealm=Realm.getDefaultInstance();
    
    Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
    mRealm.beginTransaction();
    dog.setName(newName);
    mRealm.commitTransaction();
    
  • 검색 (1) 전체 검색 결 과 는 Realm Results 이 며, mRealm. copy FromRealm (dogs) 방법 으로 List
  • 로 전환 할 수 있 습 니 다.
     public List queryAllDog() {
            Realm  mRealm=Realm.getDefaultInstance();
    
            RealmResults dogs = mRealm.where(Dog.class).findAll();
    
            return mRealm.copyFromRealm(dogs);
        }
    

    (2) 조건 조회
     public Dog queryDogById(String id) {
            Realm  mRealm=Realm.getDefaultInstance();
    
            Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();
            return dog;
        }
    
    

    (3) 검색 결과 정렬
    /**
         * query (    )
         */
        public List queryAllDog() {
            RealmResults dogs = mRealm.where(Dog.class).findAll();
            /**
             *      , Id    ,           
             */
            //    
            dogs=dogs.sort("id");
            //    
            dogs=dogs.sort("id", Sort.DESCENDING);
            return mRealm.copyFromRealm(dogs);
        }
    

    (4) 기타 조회 sum, min, max, average 는 전체 데이터 필드 만 지원 합 니 다.
    /**
         *        
         */
        private void getAverageAge() {
             double avgAge=  mRealm.where(Dog.class).findAll().average("age");
        }
    
        /**
         *       
         */
        private void getSumAge() {
          Number sum=  mRealm.where(Dog.class).findAll().sum("age");
            int sumAge=sum.intValue();
        }
    
        /**
         *        
         */
        private void getMaxId(){
          Number max=  mRealm.where(Dog.class).findAll().max("age");
            int maxAge=max.intValue();
        }
    

    비동기 조작
    대부분의 경우 Realm 의 추가 삭제 와 수정 작업 이 충분히 빠 르 고 UI 스 레 드 에서 작업 을 수행 할 수 있 습 니 다.그러나 비교적 복잡 한 첨삭 검사 나 첨삭 검사 작업 의 데이터 가 비교적 많 을 때 하위 라인 에서 조작 할 수 있다
    (1) 비동기 증가:
     private void addCat(final Cat cat) {
          RealmAsyncTask  addTask=  mRealm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    realm.copyToRealm(cat);
                }
            }, new Realm.Transaction.OnSuccess() {
                @Override
                public void onSuccess() {
                    ToastUtil.showShortToast(mContext,"    ");
                }
            }, new Realm.Transaction.OnError() {
                @Override
                public void onError(Throwable error) {
                    ToastUtil.showShortToast(mContext,"    ");
                }
            });
    
        }
    

    마지막 으로 Activity 나 Fragment 를 없 앨 때 비동기 작업 을 취소 합 니 다.
    @Override
        protected void onDestroy() {
            super.onDestroy();
           if (addTask!=null&&!addTask.isCancelled()){
                addTask.cancel();
            }
        }
    

    (2) 비동기 삭제
     private void deleteCat(final String id, final ImageView imageView){
          RealmAsyncTask  deleteTask=   mRealm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    Cat cat=realm.where(Cat.class).equalTo("id",id).findFirst();
                    cat.deleteFromRealm();
    
                }
            }, new Realm.Transaction.OnSuccess() {
                @Override
                public void onSuccess() {
                    ToastUtil.showShortToast(mContext,"      ");
                }
            }, new Realm.Transaction.OnError() {
                @Override
                public void onError(Throwable error) {
                    ToastUtil.showShortToast(mContext,"      ");
                }
            });
    
        }
    

    마지막 으로 Activity 나 Fragment 를 없 앨 때 비동기 작업 을 취소 합 니 다.
    @Override
        protected void onDestroy() {
            super.onDestroy();
           if (deleteTask!=null&&!addTask.isCancelled()){
                deleteTask.cancel();
            }
        }
    

    (3) 비동기 수정
    RealmAsyncTask  updateTask=   mRealm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    Cat cat=realm.where(Cat.class).equalTo("id",mId).findFirst();
                    cat.setName(name);
                }
            }, new Realm.Transaction.OnSuccess() {
                @Override
                public void onSuccess() {
                    ToastUtil.showShortToast(UpdateCatActivity.this,"    ");
    
                }
            }, new Realm.Transaction.OnError() {
                @Override
                public void onError(Throwable error) {
                    ToastUtil.showShortToast(UpdateCatActivity.this,"    ");
                }
            });
    

    마지막 으로 Activity 나 Fragment 를 없 앨 때 비동기 작업 을 취소 합 니 다.
    @Override
        protected void onDestroy() {
            super.onDestroy();
           if (updateTask!=null&&!addTask.isCancelled()){
                updateTask.cancel();
            }
        }
    

    (4) 비동기 검사
     RealmResults   cats=mRealm.where(Cat.class).findAllAsync();
            cats.addChangeListener(new RealmChangeListener>() {
                @Override
                public void onChange(RealmResults element) {
                   element= element.sort("id");
                    List datas=mRealm.copyFromRealm(element);
    
                }
            });
    

    마지막 으로 Activity 나 Fragment 를 없 앨 때 비동기 작업 을 취소 합 니 다.
    @Override
        protected void onDestroy() {
            super.onDestroy();
            cats.removeChangeListeners();
    
        }
    

    기타 관련 설명 1. 지원 하 는 데이터 형식: boolean, byte, short, int, long, float, double, String, Date and byte [] Realm 에서 byte, short, int, long 은 최종 적 으로 log 유형 2 로 매 핑 되 었 습 니 다. 설명 @ Primary Key ① 필드 는 String, integer, byte, short, int, long 및 그들의 패 키 징 류 Byte, Short, Integer 여야 합 니 다.and Long ② 이 주 해 를 사용 한 후 copy ToRealmOrUpdate () 방법 을 사용 하여 홈 키 를 통 해 대상 을 조회 할 수 있 습 니 다. 조회 가 되면 업데이트 합 니 다. 그렇지 않 으 면 새 대상 으로 대체 할 수 있 습 니 다.③ 이 주 해 를 사용 하여 기본 설정 @ index 주 해 ④ 이 주 해 를 사용 한 후 데 이 터 를 만 들 고 업데이트 하 는 것 이 느 리 고 데 이 터 를 조회 하 는 것 이 빠 릅 니 다. @Required 데 이 터 는 null @ Ignore 에 무시 할 수 없습니다. 즉, 이 필드 는 로 컬 @ Index 에 저장 되 지 않 고 이 필드 에 검색엔진 을 추가 하면 삽입 데이터 가 느 려 지고 데이터 가 커지 지만 조회 가 빨 라 집 니 다.읽 기 성능 을 최적화 해 야 할 경우 사용 하 는 것 을 권장 합 니 다.
    추천 글 은 Realm 암호 화 업그레이드 와 관련 되 어 있 습 니 다.http://www.jianshu.com/p/28912c2f31db 데모 주소:https://github.com/RaphetS/DemoRealm 안 드 로 이 드 QQ 그룹 가입 을 환영 합 니 다: 104286694

    좋은 웹페이지 즐겨찾기