一:什麼是GreenDao?
GreenDao是Android平臺下的一個ORM(「對象/關係映射」)框架。它將Java對象映射成數據庫表,以後你就能夠面對對象來存儲,更新,刪除,查詢Objects.
二:GreenDao的優勢
1.高性能
2.易於使用的強大API,涵蓋關係和鏈接
3.最小的內存消耗
4.庫的大小(<100kB)以保持較低的構建時間並避免65K方法限制
5.數據庫加密:GreenDao支持SQLCipher,以確保用戶的數據安全
三:GreenDao的使用
GreenDao的三個核心類:分別是DaoMaster,DaoSession,XXXDao,這三個類都會自動建立,無需本身編寫。
DaoMaster:DaoMaster保存數據庫對象(SQLiteDatabase)並管理特定模式的DAO類(而不是對象)。他的靜態方法來建立表或者刪除它們。它的內部OpenHelper和DevOpenHelper是SQLiteOpenHelper實現,它們在SQLite數據庫中建立模式。
DaoSession:管理特定模式的全部可用DAO對象,你能夠使用其中一個getter方法獲取該對象。DaoSession還提供了一些通用的持久方法,如實體的插入,加載,更新,刷新和刪除。
XXXDao:數據訪問對象(DAO)持久存在並查詢實體。對於每個實體,GreenDao生成DAO.它具備DaoSession更多的持久性方法
Entities:可持久化對象。一般,實體對象表明一個數據庫行,使用標準java屬性。
四:Android Studio中使用GreenDao
1.遇到編譯問題
java
Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'
最後這一句的中文意思是:您的項目可能使用的第三方插件與項目中的其餘插件或項目所要求的Gradle版本不兼容。在損壞Gradle進程的狀況下,您還能夠嘗試關閉IDE,而後殺死全部Java進程。
解決方式:把GreenDao版本升級成3.3.0就沒有問題了
緣由多是:*Gradle 的版本和庫的Gradle版本不兼容,引起的Bug
若是,不是GreeDao的問題,那麼多是項目中使用的庫須要的定的構建版本工具與版本不兼容*。
2.使用GreenDao,須要添加GreenDao Gradle並添加GreenDao庫:
第一步:在工程的build.gradle文件下添加:android
dependencies { classpath 'com.android.tools.build:gradle:3.2.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 1.第一步,添加插件 更好支持GreenDao // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files}
第二步:在相關Moudle:app的build.gradle文件下添加:數據庫
apply plugin: 'org.greenrobot.greendao' //第二步apply plugin dependencies { implementation 'org.greenrobot:greendao:3.3.0' // 第三步:添加庫 }
第三步:配置數據庫相關信息segmentfault
android{ greendao{ schemaVersion 2 //數據庫版本號,升級時可配置 daoPackage 'com.soudao.test.greendao'//dao的包名,包名默認是entity實體類所在的包 targetGenDir 'src/main/java'//生成數據庫文件的目錄DaoMaster和DaoSession } }
schemaVersion: 數據庫schema版本,也能夠理解爲數據庫版本號
daoPackage:設置DaoMaster 、DaoSession、Dao包名
targetGenDir:設置DaoMaster 、DaoSession、Dao目錄
targetGenDirTest:設置生成單元測試目錄
generateTests:設置自動生成單元測試用例
五:建立實體類@Entityapi
@Entity public class Teacher { @Id private Long id; private String name; @Transient private int tempUsageCount; }
點擊Build-->Make Project編譯項目會自動編譯生成get,set方法而且在配置的com.soudao.test.greendao目錄下生成三個文件DaoMaster,DaoSession,XXXDao文件。
安全
@Entity public class Teacher { @Id private Long id; private String name; @Transient private int tempUsageCount; @Generated(hash = 1434396195) public Teacher(Long id, String name) { this.id = id; this.name = name; } @Generated(hash = 1630413260) public Teacher() { } 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; } }
實體類相關屬性的註解:
@Id :主鍵 Long型,能夠經過@Id(autoincrement = true)設置自增加
@Property:設置一個非默認關係映射所對應的列名,默認是的使用字段名 舉例:@Property (nameInDb="name")
@NotNull:設置數據庫表當前列不能爲空
@Transient :添加次標記以後不會生成數據庫表的列
@Index:使用@Index做爲一個屬性來建立一個索引,經過name設置索引別名,也能夠經過unique給索引添加約束(@Index(unique = true)//設置惟一性)
@Unique:向數據庫列添加了一個惟一的約束
@ToOne:表示一對一關係
@OrderBy:更加某一字段排序 ,例如:@OrderBy(「date ASC」)
六:實現增刪改查
1.上面咱們已經獲取到DaoMaster 、DaoSession、Dao類
咱們建立一個數據庫管理類DBManagerapp
public class DBManager { private Context context;//定義一個上下文 private final static String dbName = "test_db";//定義一個數據庫名 private static DBManager mInstance;//單例 private DaoMaster.DevOpenHelper openHelper;//在構造方法裏建立一個DaoMaster.DevOpenHelper private DaoSession mDaoSession;//會話層操做具體的DAO對象 private SQLiteDatabase db;//獲取一個數據庫操做類 public DBManager(Context context) { this.context = context; openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } /* * 雙重檢索獲取DBManager對象的單例*/ public static DBManager getInstance(Context context) { if (mInstance == null) { synchronized (DBManager.class) { if (mInstance == null) { mInstance = new DBManager(context); } } } return mInstance; } /** * 獲取可讀的數據庫 */ public SQLiteDatabase getReadableDatabase() { if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getReadableDatabase(); return db; } /** * 獲取可寫的數據庫 */ public SQLiteDatabase getWritableDatabase() { if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } db = openHelper.getWritableDatabase(); return db; } /** * 獲取可寫的會話層 */ public DaoSession getWriteDaoSession() { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); mDaoSession = daoMaster.newSession(); return mDaoSession; } /** * 獲取可讀的會話層 */ public DaoSession getReadDaoSession() { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); mDaoSession = daoMaster.newSession(); return mDaoSession; } }
1.DBManager.getInstance(this);等價於DaoMaster.DevOpenHelper helper=new DaoMaster.DevOpenHelper(this,"test_db");
單例獲取DaoMaster.DevOpenHelper對象
2.DBManager.getInstance(this).getWritableDatabase()等價於SQLiteDatabase db=helper.getWritableDatabase();
3.DBManager.getInstance(this).getWriteDaoSession()等價於
DaoMaster daoMaster=new DaoMaster(db);
DaoSession daoSession=daoMaster.newSession();
這三步獲取到DaoSession會話層對象能夠去操做
刪除一條數據框架
public void deleteUser(Student student) { DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession(); UserDao userDao = daoSession.getStudentDao(); userDao.delete(student); }
插入一條數據工具
public void insertUser(Student student) { DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession(); UserDao userDao = daoSession.getStudentDao(); userDao.insert(student); }
更新一條數據性能
public void updateUser(Student student) { DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession(); UserDao userDao = daoSession.getStudentDao(); userDao.update(student); }
查詢學生列表
public List<User> queryUserList() { DaoSession daoSession = DBManager.getInstance(this).getReadDaoSession(); UserDao userDao = daoSession.getStudentDao(); QueryBuilder<Student> qb = userDao.queryBuilder(); List<Student> list = qb.list(); return list; }
等還能夠查詢針對用戶的篩選。具體須要觸類旁通。
結語:不積跬步,無以至千里。不積小流,無以成江海。