greenDao3.간단명료하다

15651 단어 GreeDao
특징
1. 간결한 라이브러리 2.성능 극대화 3.메모리 오버헤드 최소화 4.사용하기 쉬운 APIs 5.안드로이드 높이 최적화 6.데이터베이스 암호화 지원
프로비저닝
  • 프로젝트의gradle 파일에 그린DAO 플러그인 도입
  • buildscript { repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:2.3.2’ classpath ‘org.greenrobot:greendao-gradle-plugin:3.2.1’ } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
    2.module의gradle 파일에 그린DAO 플러그인을 추가하고 관련 라이브러리 도입
    apply plugin: ‘com.android.application’ apply plugin: ‘org.greenrobot.greendao'android {...//greendao 관련 설정 greendao {//버전 번호 - 업그레이드 schemaVersion 1/greendao로 dao를 출력하는 데이터베이스 조작 실체 클래스 폴더(상대 경로 패키지 이름 + 사용자 정의 경로 이름, 패키지는 패키지 이름의 직접 경로 아래에 생성됨) daoPackage ‘com.xxx.greendao'//greendao 실체 패키지 폴더 targetGenDir'src/main/java'buildTypes {...} dependencies {...//GreenDao compile'org.greenrobot:greendao:3.2.0'compile'net.zetic:android-database-sqlcipher:3.5.7'/암호화 필수 라이브러리 compile project(':mylibrary')}
    주의: GreenDao가 자동으로 실체 패키지 폴더를 생성하는 targetGenDir 'src/main/java' 를 설정하지 않았을 때 기본 경로가 있습니다.기본 경로는 프로젝트->app->build->generated->source->greendao->com입니다.xxx.entity->…
    초기화
    1. 실체 클래스 만들기
    /*@Entity 메모 마크업, id 열은 필수 필드이고 유형은 @Generated 대신 Long 유형 @keep이어야 합니다.테이블 효과가 Mark Project 이후에도 필드는 수정 가능*/@Entity public class PersonBean {@Id @NotNull private long id;private String name;private String age;@Keep public PersonBean (long id, String name, String age) {this.id = id;this.name = name;this.age = age = age;@}Keep public PersonBean() { } public long getId() { return this.id; } public void setId(long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getAge() { return this.age; } public void setAge(String age) { this.age = age; } }
    2.MarkProject
    Build –>Mark Project 또는 AS 맨 위에 있는 도구막대 망치나 Ctrl+F9을 누르면 그린 Dao가 초기화되고 설정된 경로(targetGenDir'src/main/java')에서 DaoMaster,DaoSession과 (실체가 대응하는 Dao)PersonBeanDao가 생성됩니다.
    3. 새 Application(MyAPP) 클래스 글로벌 초기화 참고: 1.이런 것들은 프로젝트 명세서 파일에 설정해야 한다.2. 자체 암호화 기능을 사용하려면 암호화 라이브러리를 도입해야 한다:compile'net.zetetic:android-database-sqlcipher:3.5.7
    public class My APP extends Application {private static Dao Session, public static final boolean ENCRYPTED = true;//public static final String DATA PWD 암호화 여부 = "xxxx",//사용자 정의 암호화 키 @Override public void onCreate() {super. on Create(), Datainit()}//greenDao private void initData() {//데이터베이스 만들기 DaoMaster. DevOpenHelper daoHelper = new DaoMaster. DevOpenHelper(this, ENCRYPTED? "notes-db-encrypted": "notes-db");/쓰기 가능한 데이터베이스 가져오기 dbase = ENCRYPTED? daoHelper.getEncrypted Writable Db(DATA PWD): Heletable D.ghtable; //데이터베이스 개체 가져오기DaoMaster daoMaster = new DaoMaster(db);//Dao 관리자 가져오기 Dao Session = dao Master.newSession(); } public static DaoSession getDaoInstant() { return daoSession; } }
    사용
    1. 새 실체 조작 클래스 PersonDao 주의: 이런 것은 필수적이지 않고 봉인을 위해 PersonBeanDao를 자동으로 생성하는 방법일 뿐입니다.MakeProject 시 자동으로 생성되는 Dao 클래스(PersonBeanDao)를 직접 사용해 관련 메서드를 호출할 수도 있습니다.
    public class PersonDao {//삽입 데이터public static void insertPersonBean(PersonBean personBean) {My APP.getDao Instant().getPersonBean Dao().insertOrreplace(personBean);//삭제 데이터는 id public static void deletePerson(long id) {APP.getDao Instant().getPersonBeanDao().deleteByKey(id)}public static void updatePerson(PersonBean personBean) { APP.getDaoInstant().getPersonBeanDao().update(personBean); } //전체 public static List query All () {return APP.getDao Instant ().getPersonBeanDao ().loadAll ();//조건 조회public static Listquery Person(String name) {return APP.getDao Instant().getPersonBeanDao().query Builder().where(PersonBeanDao.Properties.Name.eq(name).list().list()}2. 프로젝트에서 업무 수요에 따라 CRUD...PersonBean personBean = new PersonBean(1,name,password).PersonDao.insertPerson(personBean); … …
    업그레이드
    주의: 기본 업그레이드(실체 속성 변경(표 구조))는 기존의 데이터를 비우고 해결 방향: 1.임시 테이블 만들기 2.원본 테이블 삭제 3.새 테이블 생성 4.임시 테이블 데이터를 새 테이블로 복사하고 임시 테이블을 삭제합니다.gradle에서 GreenDao의 버전 번호 파일 수정
    greendao {schemaVersion 2//예컨대 이전에는 1...} 2.새 DaoMaster.OpenHelper 하위 클래스(DBHelper)public class DBHelper extends DaoMaster.OpenHelper { public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } @Override public void on Upgrade(SQLite Database db, int oldVersion, int newVersion) {//super. on Upgrade(db,oldVersion, newVersion);//데이터베이스의 업데이트를 조작하고 몇 개의 테이블 업그레이드를 매개 변수로 전송할 수 있습니다. PersonBean.class는 업그레이드할 테이블MigrationHelper.getInstance().migrate(db,PersonBean.class)입니다.
    3. 데이터 마이그레이션 클래스 사용자 정의(MigrationHelper)
    package com.xxx;
    import android.database.Cursor;
    import android.text.TextUtils;
    import android.util.Log;
    import org.greenrobot.greendao.AbstractDao;
    import org.greenrobot.greendao.database.Database;
    import org.greenrobot.greendao.internal.DaoConfig;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import com.xxx.greendao.DaoMaster;
    public class MigrationHelper {
    
        private static final String CONVERSION_CLASS_NOT_FOUND_EXCEPTION = "MIGRATION HELPER - CLASS DOESN'T MATCH WITH THE CURRENT PARAMETERS";
        private static MigrationHelper instance;
    
        public static MigrationHelper getInstance() {
            if (instance == null) {
                instance = new MigrationHelper();
            }
            return instance;
        }
    
        public void migrate(Database db, Class extends AbstractDao, ?>>... daoClasses) {
    
            generateTempTables(db, daoClasses);
            DaoMaster.dropAllTables(db, true);
            DaoMaster.createAllTables(db, false);
            restoreData(db, daoClasses);
        }
    
        /**
         *       
         *
         * @param db
         * @param daoClasses
         */
        private void generateTempTables(Database db, Class extends AbstractDao, ?>>... daoClasses) {
            for (int i = 0; i < daoClasses.length; i++) {
                DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);
    
                String divider = "";
                String tableName = daoConfig.tablename;
                String tempTableName = daoConfig.tablename.concat("_TEMP");
                ArrayList properties = new ArrayList<>();
    
                StringBuilder createTableStringBuilder = new StringBuilder();
    
                createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" (");
    
                for (int j = 0; j < daoConfig.properties.length; j++) {
                    String columnName = daoConfig.properties[j].columnName;
    
                    if (getColumns(db, tableName).contains(columnName)) {
                        properties.add(columnName);
    
                        String type = null;
    
                        try {
                            type = getTypeByClass(daoConfig.properties[j].type);
                        } catch (Exception exception) {
                            exception.printStackTrace();
                        }
    
                        createTableStringBuilder.append(divider).append(columnName).append(" ").append(type);
    
                        if (daoConfig.properties[j].primaryKey) {
                            createTableStringBuilder.append(" PRIMARY KEY");
                        }
    
                        divider = ",";
                    }
                }
                createTableStringBuilder.append(");");
    
                db.execSQL(createTableStringBuilder.toString());
    
                StringBuilder insertTableStringBuilder = new StringBuilder();
    
                insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" (");
                insertTableStringBuilder.append(TextUtils.join(",", properties));
                insertTableStringBuilder.append(") SELECT ");
                insertTableStringBuilder.append(TextUtils.join(",", properties));
                insertTableStringBuilder.append(" FROM ").append(tableName).append(";");
    
                db.execSQL(insertTableStringBuilder.toString());
    
            }
        }
    
        /**
         *              
         *
         * @param db
         * @param daoClasses
         */
        private void restoreData(Database db, Class extends AbstractDao, ?>>... daoClasses) {
            for (int i = 0; i < daoClasses.length; i++) {
                DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);
                String tableName = daoConfig.tablename;
                String tempTableName = daoConfig.tablename.concat("_TEMP");
                ArrayList properties = new ArrayList();
    
                for (int j = 0; j < daoConfig.properties.length; j++) {
                    String columnName = daoConfig.properties[j].columnName;
    
                    if (getColumns(db, tempTableName).contains(columnName)) {
                        properties.add(columnName);
                    }
                }
    
                StringBuilder insertTableStringBuilder = new StringBuilder();
    
                insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" (");
                insertTableStringBuilder.append(TextUtils.join(",", properties));
                insertTableStringBuilder.append(") SELECT ");
                insertTableStringBuilder.append(TextUtils.join(",", properties));
                insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";");
    
                StringBuilder dropTableStringBuilder = new StringBuilder();
                dropTableStringBuilder.append("DROP TABLE ").append(tempTableName);
                db.execSQL(insertTableStringBuilder.toString());
                db.execSQL(dropTableStringBuilder.toString());
            }
        }
    
        private String getTypeByClass(Class> type) throws Exception {
            if (type.equals(String.class)) {
                return "TEXT";
            }
            if (type.equals(Long.class) || type.equals(Integer.class) || type.equals(long.class)) {
                return "INTEGER";
            }
            if (type.equals(Boolean.class)) {
                return "BOOLEAN";
            }
    
            Exception exception = new Exception(CONVERSION_CLASS_NOT_FOUND_EXCEPTION.concat(" - Class: ").concat(type.toString()));
            exception.printStackTrace();
            throw exception;
        }
    
        private List getColumns(Database db, String tableName) {
            List columns = new ArrayList<>();
            Cursor cursor = null;
            try {
                cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 1", null);
                if (cursor != null) {
                    columns = new ArrayList<>(Arrays.asList(cursor.getColumnNames()));
                }
            } catch (Exception e) {
                Log.v(tableName, e.getMessage(), e);
                e.printStackTrace();
            } finally {
                if (cursor != null)
                    cursor.close();
            }
            return columns;
        }
    }

    4. My APP에서 구성 변경
    //greenDao private void initData 구성 () {DBHelper devOpenHelper = new DBHelper(this), 쓰기 가능한 데이터베이스 데이터베이스 데이터베이스 db 가져오기 = ENCRYPTED? daoHelper.getEncryptedWritable Db(DATA PWD): daoHelper.getWritable Db();//데이터베이스 대상 가져오기DaoMaster daoMaster = new DaoMaster(db);//dao 관리자를 얻기= Massion(Session);

    좋은 웹페이지 즐겨찾기