編輯:關於Android編程
之前用過許多的Orm框架,例如:ORMLite、greendao、ormndroid、androrm、ActiveAndroid,SugarORM等等,不過都沒有一一研究,感覺GreenDao的文檔和支持率比較高,所以就一直采用了GreenDao作為項目的Orm框架,關於這些框架的大致分析,可以看我Csdn的文章Android Orm框架分析 ,回到正題,我之前用的還是GreenDao的2.x版本,總體感覺來時是比較難用的,而且唯一不能接受的是新建一個Java項目,然後再項目中配置各個實體的字段等相關屬性,然後生成實體以及DAO操作相關的一些類。但是,當你修改了實體中的一些屬性,並且這些屬性又要在數據庫中保存的時候,你會發現每次重新運行generator之前的改變都得重新再來一次。
不過作者新發布的GreenDao3的話用了大量的注解,省去了新建項目的繁瑣,使用起來也更加簡潔明了,我們今天就來講講如何使用GreenDao3
greenDao是一個將對象映射到SQLite數據庫中的輕量且快速的ORM解決方案。
關於greenDAO的概念可以看官網greenDAO
greenDao優勢
1、一個精簡的庫
2、性能最大化
3、內存開銷最小化
4、易於使用的 APIs
5、對 Android 進行高度優化
6、秒勝當前市面上的其他Orm框架(這個也是看總體水平,也是我為什麼推崇大家用次框架的重要理由,既然要學就要學最要好用的)
GreenDao的使用
首先gradle引入
compile 'org.greenrobot:greendao:3.2.0'//GreenDao
在build.gradle中進行配置:
App:
apply plugin: 'org.greenrobot.greendao'//GreenDao
項目:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'//GreenDao
}
}
然後再Make Project 你會在build/generated/source/greendao中發現新生成的內容,build/generated/source/greendao是默認路徑,可以去配置的,配置方法在接下來將會講到。
Gradle Plugin的配置:
// In the build.gradle file of your app project:
android {
...
}
greendao {
schemaVersion 1
//daoPackage 'com.greendao.gen'
//targetGenDir 'src/main/java'
}
schemaVersion 當前數據庫結構的版本。結構版本變化時在OpenHelpers中被使用到。當你改變實體或者數據的結構時,這個值應該增加。
daoPackage 生成的DAO,DaoMaster和DaoSession的包名。默認是實體的包名。
targetGenDir 生成源文件的路徑。默認源文件目錄是在build目錄中的(build/generated/source/greendao)。
generateTests 設置是否自動生成單元測試。
targetGenDirTest 生成的單元測試的根目錄。
主要代碼
創建一個Bean文件
代碼如下
實體注解:
@Entity(
// 如果你有超過一個的數據庫結構,可以通過這個字段來區分
// 該實體屬於哪個結構
schema = "myschema",
// 實體是否激活的標志,激活的實體有更新,刪除和刷新的方法
active = true,
// 確定數據庫中表的名稱
// 表名稱默認是實體類的名稱
nameInDb = "AWESOME_USERS",
// Define indexes spanning multiple columns here.
indexes = {
@Index(value = "name DESC", unique = true)
},
// DAO是否應該創建數據庫表的標志(默認為true)
// 如果你有多對一的表,將這個字段設置為false
// 或者你已經在GreenDAO之外創建了表,也將其置為false
createInDb = false
)
public class User {
...
}
基礎注解:
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "USERNAME")
private String name;
@NotNull
private int repos;
@Transient
private int tempUsageCount;
...
}
1.實體@Entity注解
schema:告知GreenDao當前實體屬於哪個schema
active:標記一個實體處於活動狀態,活動實體有更新、刪除和刷新方法
nameInDb:在數據中使用的別名,默認使用的是實體的類名
indexes:定義索引,可以跨越多個列
createInDb:標記創建數據庫表
2.基礎屬性注解
@Id :主鍵 Long型,可以通過@Id(autoincrement = true)設置自增長
@Property:設置一個非默認關系映射所對應的列名,默認是的使用字段名 舉例:@Property (nameInDb="name")
@NotNul:設置數據庫表當前列不能為空
@Transient :添加次標記之後不會生成數據庫表的列
3.索引注解
@Index:使用@Index作為一個屬性來創建一個索引,通過name設置索引別名,也可以通過unique給索引添加約束
@Unique:向數據庫列添加了一個唯一的約束
4.關系注解
@ToOne:定義與另一個實體(一個實體對象)的關系
@ToMany:定義與多個實體對象的關系
編譯項目,User實體類會自動編譯,生成get、set方法並且會在com.greendao.gen目錄下生成三個文件,DaoMaster 、DaoSession、Dao類;
編寫幫助類
public class GreenDaoHelper {
private static DaoMaster.DevOpenHelper mHelper;
private static SQLiteDatabase db;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
/**
* 初始化greenDao,這個操作建議在Application初始化的時候添加;
*/
public static void initDatabase() {
// 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。
// 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。
// 注意:默認的 DaoMaster.DevOpenHelper 會在數據庫升級時,刪除所有的表,意味著這將導致數據的丟失。
// 所以,在正式的項目中,你還應該做一層封裝,來實現數據庫的安全升級。
mHelper = new DaoMaster.DevOpenHelper(MyApplication.context, "cache-db", null);
db = mHelper.getWritableDatabase();
// 注意:該數據庫連接屬於 DaoMaster,所以多個 Session 指的是相同的數據庫連接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public static DaoSession getDaoSession() {
return mDaoSession;
}
public static SQLiteDatabase getDb() {
return db;
}
}
增刪改查
首先獲取UserDao對象:
mUserDao = GreenDaoHelper.getDaoSession().getUserDao();
增
數據庫的增刪改查我們都將通過UserDao來進行,插入操作如下:
mUser = new User((long)1,"張三");
mUserDao.insert(mUser);//添加一個
User的第一個參數為id,如果這裡傳null的話在插入的過程中id字段會自動增長(現在知道為什麼id要為Long類型了吧!)
刪
刪除數據和修改數據的思路一樣,都是要先查找到數據:
List userList = (List) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();
for (User user : userList) {
mUserDao.delete(user);
}
where表示查詢條件,這裡我是查詢id小於等於10的數據,where中的參數可以有多個,就是說可以添加多個查詢條件。最後的list表示查詢結果是一個List集合,如果你只想查詢一條數據,最後unique即可。當然,我們也可以根據id來刪除數據:
User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();
if (user == null) {
Toast.makeText(MainActivity.this, "用戶不存在", Toast.LENGTH_SHORT).show();
}else{
mUserDao.deleteByKey(user.getId());
}
根據主鍵刪除
mUserDao.deleteByKey(id);
刪除所有數據
mUserDao.deleteAll();
改
根據ID修改數據
mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);
查
查詢全部數據
List users = mUserDao.loadAll();
查詢一條數據
User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("張三")).unique();
數據庫升級
數據庫的升級其實就兩個步驟我們來看看
1.修改gradle文件
首先在module的gradle文件中修改版本號:
//這裡改為最新的版本號
schemaVersion 2
2.修改實體類
@Entity
public class User {
@Property
private int age;
@Property
private String password;
@Id
private Long id;
@Property(nameInDb = "USERNAME")
private String username;
@Property(nameInDb = "NICKNAME")
private String nickname;
}
重現編譯項目運行即可。一般的數據庫升級這樣就可以了,特殊情況可能需要自己編寫數據庫遷移腳本。
總結
總體來說,GreenDao3.0在配置上相對於2.0要簡單的多。
個人還是比較喜歡3.0版本的,希望大家活學活用。
Request處理流程RequestQueue類中有三個主要的隊列。調用RequestQueue.add(request)加入的請求會先加入mCacheQueue(優先級
本文實例講述了Android編程之Animation動畫用法。分享給大家供大家參考,具體如下:Animations一、Animations介紹Animations是一個實
ContentProvider,從字面意義上理解,內容提供者,這個類目的就是一個橋梁的作用,讓一個應用的數據(SQLiteDatabase, SharedPreferen
引導頁面相信大家都不會陌生,安裝了一個新的App後第一次打開,都會有類似下圖,相當於說明文檔 實現效果 程序目錄結構 在主layout裡main.