Android學習之數據庫DBFlow的使用

從事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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章