日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android数据存储之GreenDao 3.0 详解

發(fā)布時間:2025/3/15 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android数据存储之GreenDao 3.0 详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

?今天一大早收到GreenDao 3.0 正式發(fā)布的消息,自從2014年接觸GreenDao至今,項目中一直使用GreenDao框架處理數(shù)據(jù)庫操作,本人使用數(shù)據(jù)庫路線 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙著公司的項目需求,只能晚上加班來學(xué)習(xí)最新的GreenDao 3.0使用方式了。

GreenDao 介紹:

? ? greenDAO是一個對象關(guān)系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操作關(guān)系型數(shù)據(jù)庫,它能夠讓你操作數(shù)據(jù)庫時更簡單、更方便。如下圖所示:

官網(wǎng)地址:http://greenrobot.org/greendao/

github:https://github.com/greenrobot/greenDAO

GreenDao 優(yōu)點:

  • 性能高,號稱Android最快的關(guān)系型數(shù)據(jù)庫

  • 內(nèi)存占用小
  • 庫文件比較小,小于100K,編譯時間低,而且可以避免65K方法限制

  • 支持數(shù)據(jù)庫加密 ?greendao支持SQLCipher進行數(shù)據(jù)庫加密 有關(guān)SQLCipher可以參考這篇博客Android數(shù)據(jù)存儲之Sqlite采用SQLCipher數(shù)據(jù)庫加密實戰(zhàn)

  • 簡潔易用的API

GreenDao 3.0改動:

? ?使用過GreenDao的同學(xué)都知道,3.0之前需要通過新建GreenDaoGenerator工程生成Java數(shù)據(jù)對象(實體)和DAO對象,非常的繁瑣而且也加大了使用成本。

GreenDao ?3.0最大的變化就是采用注解的方式通過編譯方式生成Java數(shù)據(jù)對象和DAO對象。

GreenDao 3.0使用方式:

?1.)在build.gradle添加如下配置
buildscript {repositories {mavenCentral()}dependencies {classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'} }apply plugin: 'org.greenrobot.greendao'dependencies {compile 'org.greenrobot:greendao:3.0.1' }
2.)新建實體
@Entity public class User {@Idprivate Long id; private String name; private int age; //下面省去了 setter/getter }

此時編譯一下自動生成DaoMaster 、DaoSession、Dao,如圖所示 默認位置:

3.)Gradle 插件配置

比如上面想指定生成DaoMaster 、DaoSession、Dao位置

greendao {targetGenDir 'src/main/java' }
  • schemaVersion:?數(shù)據(jù)庫schema版本,也可以理解為數(shù)據(jù)庫版本號
  • daoPackage:設(shè)置DaoMaster 、DaoSession、Dao包名
  • targetGenDir:設(shè)置DaoMaster 、DaoSession、Dao目錄
  • targetGenDirTest:設(shè)置生成單元測試目錄
  • generateTests:設(shè)置自動生成單元測試用例
4.)實體@Entity注解
  • schema:告知GreenDao當前實體屬于哪個schema
  • active:標記一個實體處于活動狀態(tài),活動實體有更新、刪除和刷新方法
  • nameInDb:在數(shù)據(jù)中使用的別名,默認使用的是實體的類名
  • indexes:定義索引,可以跨越多個列
  • createInDb:標記創(chuàng)建數(shù)據(jù)庫表
5.)基礎(chǔ)屬性注解
  • @Id :主鍵 Long型,可以通過@Id(autoincrement = true)設(shè)置自增長
  • @Property:設(shè)置一個非默認關(guān)系映射所對應(yīng)的列名,默認是的使用字段名 舉例:@Property (nameInDb="name")
  • @NotNul:設(shè)置數(shù)據(jù)庫表當前列不能為空
  • @Transient?:添加次標記之后不會生成數(shù)據(jù)庫表的列
6.)索引注解
  • @Index:使用@Index作為一個屬性來創(chuàng)建一個索引,通過name設(shè)置索引別名,也可以通過unique給索引添加約束
  • @Unique:向數(shù)據(jù)庫列添加了一個唯一的約束
7.)關(guān)系注解
  • @ToOne:定義與另一個實體(一個實體對象)的關(guān)系
  • @ToMany:定義與多個實體對象的關(guān)系

GreenDao 3.0簡單實戰(zhàn):

? ? ? 1.)通過上面使用方式我們可以獲取DaoMaster 、DaoSession、Dao類

?這里聲明一個數(shù)據(jù)庫管理者單例

public class DBManager {private final static String dbName = "test_db"; private static DBManager mInstance; private DaoMaster.DevOpenHelper openHelper; private Context context; public DBManager(Context context) { this.context = context; openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } /** * 獲取單例引用 * * @param context * @return */ public static DBManager getInstance(Context context) { if (mInstance == null) { synchronized (DBManager.class) { if (mInstance == null) { mInstance = new DBManager(context); } } } return mInstance; } }
2.)獲取可讀可寫數(shù)據(jù)庫

? 可讀數(shù)據(jù)庫

/*** 獲取可讀數(shù)據(jù)庫*/private SQLiteDatabase getReadableDatabase() {if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getReadableDatabase(); return db; }

? ?可寫數(shù)據(jù)庫

/*** 獲取可寫數(shù)據(jù)庫*/private SQLiteDatabase getWritableDatabase() {if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getWritableDatabase(); return db; }
3.)插入數(shù)據(jù)
/*** 插入一條記錄** @param user*/public void insertUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.insert(user); } /** * 插入用戶集合 * * @param users */ public void insertUserList(List<User> users) { if (users == null || users.isEmpty()) { return; } DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.insertInTx(users); }
4.)刪除數(shù)據(jù)
/*** 刪除一條記錄** @param user*/public void deleteUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.delete(user); }
5.)更新數(shù)據(jù)
/*** 更新一條記錄** @param user*/public void updateUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.update(user); }
6.)查詢數(shù)據(jù)
/*** 查詢用戶列表*/public List<User> queryUserList() {DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder<User> qb = userDao.queryBuilder(); List<User> list = qb.list(); return list; } /** * 查詢用戶列表 */ public List<User> queryUserList(int age) { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder<User> qb = userDao.queryBuilder(); qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age); List<User> list = qb.list(); return list; }
7.)測試程序
DBManager dbManager = DBManager.getInstance(this);for (int i = 0; i < 5; i++) {User user = new User(); user.setId(i); user.setAge(i * 3); user.setName("第" + i + "人"); dbManager.insertUser(user); } List<User> userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--before-->" + user.getId() + "--" + user.getName() +"--"+user.getAge()); if (user.getId() == 0) { dbManager.deleteUser(user); } if (user.getId() == 3) { user.setAge(10); dbManager.updateUser(user); } } userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--after--->" + user.getId() + "---" + user.getName()+"--"+user.getAge()); }

運行結(jié)果

?

總結(jié):

? ?本文主要介紹了GreenDao 3.0使用注解的情況,以及實現(xiàn)了簡單的增刪改查,接下來會更一步學(xué)習(xí)GreenDao更為復(fù)雜的使用的方式。

干我們這行,啥時候懈怠,就意味著長進的停止,長進的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天!

轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/7562174.html

總結(jié)

以上是生活随笔為你收集整理的Android数据存储之GreenDao 3.0 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。