greenDao3.간단명료하다
15651 단어 GreeDao
1. 간결한 라이브러리 2.성능 극대화 3.메모리 오버헤드 최소화 4.사용하기 쉬운 APIs 5.안드로이드 높이 최적화 6.데이터베이스 암호화 지원
프로비저닝
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);