從事Android開發這麼久,大大小小的項目也接觸了十幾個,但是數據庫的應用卻很少,因爲現在大多數的數據操作都可以讓後臺來實現,但也少不了Android創建數據庫的情況,當數據要求保存在本地,而且對增刪改查有很高要求時,數據庫還是必要的,很多人都知道SQLite這種輕量級的Android開發數據庫,但是其需要對數據庫的語法有一定掌握,今天來公司加班,順便我們來學習另外一種DBFlow數據庫的使用。
貼上DBFlow的優點介紹
DBFlow的設計吸取了其他很多ORM框架中好的特徵,並將之做得更好。它很靈活,讓你能更專注於App中真正需要關注的地方。不要讓一個ORM庫限制了你的思維,而是讓代碼在你的App中工作得更好。
擴展性: ORM所需的數據類只需要實現Model接口即可,而不需要必須繼承一個類,同時爲了方便,我們還是推薦繼承BaseModel,這是Model接口的一個標準實現。這樣你既可以通過繼承一個來自其他包的非Model類來生成你的數據庫表,也可以通過繼承一個Model類並通過添加@Column註解的屬性向表中自由添加列。這一切都是爲了方便你的使用。
速度:DBFlow基於AnnotationProcessing(註解處理器),通過編譯期代碼生成,運行時對性能是零損耗的。通過模板來爲你維護生成的代碼。通過緩存和儘可能地重用對象,我們得到了比原生SQLite更快的速度。同時我們還支持懶加載(lazy-loading),比如對於@ForeignKey和@OneToMany,這使得我們有着更高效得查詢效率。
SQLite查詢流(SQLite Query Flow):
DBFlow的查詢語法儘可能地和SQL語句相似,使您能更快上手。select(name,
screenSize).from(Android.class).where(name.is(“Nexus
5x”)).and(version.is(6.0)).querySingle()
開源: 整個DBFlow庫都是開源的,而且也非常歡迎大家來爲這個庫貢獻自己的力量。 Robust:
我們支持Trigger,ModelView,Index,Migration,所有的數據庫操作都在同一個線程(線程安全),還有其他特性。
多數據庫、多表單: 我們無縫支持多數據庫文件,database modules using DBFlow in other
dependencies, simultaneously. 基於SQLite:
SQLite是世界上使用最廣泛的數據庫引擎,基於SQLite的DBFlow使你不需要被限制在某些平臺上。
特性: 1、無縫支持多個數據庫;
2、使用annotation processing提高速度;
3、ModelContainer類庫可以直接解析像JSON這樣的數據;
4、增加靈活性的豐富接口。
可以看出來優點是不需要懂複雜的SQL語句,而且可以直接解析json數據
下面我們來一步步學習使用方法
第一,我創建了一個TestDBFlow 的project,在其build.gradle(Project TestDBFLow)文件中添加
classpath'com.neenbedankt.gradle.plugins:android-apt:1.4'
1
第二,需要在build.gradle(Module :app)文件中添加
貼上代碼
apply plugin:'com.neenbedankt.android-apt'
1
apt'com.raizlabs.android:DBFlow-Compiler:2.2.1'compile"com.raizlabs.android:DBFlow-Core:2.2.1"compile"com.raizlabs.android:DBFlow:2.2.1"
1
2
3
第三,需要創建一個application文件,在onCrete()方法中初始化
/**
* Created by wangchang on 2016/3/19.
*/publicclassmyApplicationextendsApplication{@OverridepublicvoidonCreate() {super.onCreate(); FlowManager.init(getApplicationContext()); }
1
2
3
4
5
6
7
8
9
10
這樣整個配置就完成了,下面我們來看看如何使用
第一,創建數據庫
我們需要自己創建一個數據庫,定義數據庫名稱,版本號
/**
* Created by wangchang on 2016/3/19.
*/@Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION)publicclassDBFlowDatabase{//數據庫名稱publicstaticfinalString NAME ="DBFlowDatabase";//數據庫版本號publicstaticfinalintVERSION =1;}
1
2
3
4
5
6
7
8
9
10
11
12
其次創建model文件
/**
* Created by wangchang on 2016/3/19.
*/@ModelContainer@Table(databaseName = DBFlowDatabase.NAME)publicclassUserModelextendsBaseModel{//自增ID@Column@PrimaryKey(autoincrement =true)publicLong id;@ColumnpublicString name;@Columnpublicintsex;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這裏簡單介紹下,必須繼承BaseModel,BaseModel包含了基本的數據庫操作(save、delete、update、insert、exists),可以發現這個表是關聯上面定義的數據庫,UserModel 的id是自增的id(autoincrement )。
一個正確的數據表類需要以下幾項: 對類添加@Table註解 聲明所連接的數據庫類,這裏是DBFlowDatabase。 定義至少一個主鍵。
這個類和這個類中數據庫相關列的修飾符必須是包內私有或者public。 這樣生成的_Adapter類能夠訪問到它。 NOTE:
列(Column)屬性可以是private,但這樣就必須指定公有public的getter和setter方法。
創建完成後,需要編譯一下,點擊編譯按鈕,或者Build->Make Project即可,它會自動生成一些數據庫文件,也會提示你創建是否有誤!
然後,就是重頭戲,怎麼使用增刪改查
UserModel people = new UserModel();people.name="張三";people.sex=1;people.save();//添加對象,一條一條保存//people.update();//更新對象//people.delete();//刪除對象//people.insert();//插入對象
1
2
3
4
5
6
7
8
9
10
當數據量比較大時,比如10000條數據這樣保存就會很慢,這裏對大數據就會用到事物,批量保存,
UserModel people =newUserModel(); ArrayListlist=newArrayList<>();for(inti=0;i<10000;i++) { people.name ="張三"; people.sex =1;list.add(people); }//實時保存,馬上保存newSaveModelTransaction<>(ProcessModelInfo.withModels(list)).onExecute();//異步保存,使用異步,如果立刻查詢可能無法查到結果//TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)));
1
2
3
4
5
6
7
8
9
10
11
12
其次,就是查詢了,這是個重點
當你要查詢返回一個對象時
//返回單個查詢結果UserModel user =newSelect().from(UserModel.class).querySingle();
1
2
當你要查詢返回一個集合時
//返回所有查詢結果List peoples =newSelect().from(UserModel.class).queryList();
1
2
這些是些簡單的查詢操作,當查詢條件不滿足一個時,我們該怎麼做呢?
//查詢gender =1的所有People List peoples2 = new Select().from(UserModel.class).where(Condition.column(UserModel$Table.NAME).is("張三"), Condition.column(UserModel$Table.SEX).is(1)).queryList();
1
2
3
4
5
查詢名字爲張三,性別爲1的人的集合,通過添加Condition.column來添加搜索條件
最後,怎麼保存json數據到DBFlow呢
JSONModel jsonModel =newJSONModel<>(json, TestObject.class);// constructs an insert or update query based on the JSON contentsjsonModel.save(false);// deletes a model based on the JSON contentsjsonModel.delete(false);
1
2
3
4
5
6
7
這裏需要注意一些限制
1.它們必須引用在相同數據庫中已定義的數據表Model。
2.你無法對它們使用SELECT操作,因爲它們並不是一個已存在的表,只是提供了一些方便的方法使它們看起來像一個Model。
3. 請確保被引用的表是正確的,因爲它本身無法辨別表是否正確。
4.對於JSON/Map/Object,它並不是一個全功能的語法分析器,它只是一個簡單、好用的數據容器。
就是說這裏只是保存json數據到本地,數據庫僅作爲容器,而不可以進行增刪改查操作
只有版本更新,我還沒弄成功,這裏就先不貼了,其實作爲Android開發我覺得以上已經足以滿足我們開發需求了,附上DBFLow官方文檔
轉自:https://blog.csdn.net/qq_16131393/article/details/50932020