Android学习之数据库DBFlow的使用
2016-03-19 17:25
676 查看
从事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)文件中添加
第二,需要在build.gradle(Module :app)文件中添加
贴上代码
第三,需要创建一个application文件,在onCrete()方法中初始化
这样整个配置就完成了,下面我们来看看如何使用
第一,创建数据库
我们需要自己创建一个数据库,定义数据库名称,版本号
其次创建model文件
这里简单介绍下,必须继承BaseModel,BaseModel包含了基本的数据库操作(save、delete、update、insert、exists),可以发现这个表是关联上面定义的数据库,UserModel 的id是自增的id(autoincrement )。
一个正确的数据表类需要以下几项: 对类添加@Table注解 声明所连接的数据库类,这里是DBFlowDatabase。 定义至少一个主键。
这个类和这个类中数据库相关列的修饰符必须是包内私有或者public。 这样生成的_Adapter类能够访问到它。 NOTE:
列(Column)属性可以是private,但这样就必须指定公有public的getter和setter方法。
创建完成后,需要编译一下,点击编译按钮,或者Build->Make Project即可,它会自动生成一些数据库文件,也会提示你创建是否有误!
然后,就是重头戏,怎么使用增删改查
当数据量比较大时,比如10000条数据这样保存就会很慢,这里对大数据就会用到事物,批量保存,
其次,就是查询了,这是个重点
当你要查询返回一个对象时
当你要查询返回一个集合时
这些是些简单的查询操作,当查询条件不满足一个时,我们该怎么做呢?
查询名字为张三,性别为1的人的集合,通过添加Condition.column来添加搜索条件
最后,怎么保存json数据到DBFlow呢
这里需要注意一些限制
1.它们必须引用在相同数据库中已定义的数据表Model。
2.你无法对它们使用SELECT操作,因为它们并不是一个已存在的表,只是提供了一些方便的方法使它们看起来像一个Model。
3. 请确保被引用的表是正确的,因为它本身无法辨别表是否正确。
4.对于JSON/Map/Object,它并不是一个全功能的语法分析器,它只是一个简单、好用的数据容器。
就是说这里只是保存json数据到本地,数据库仅作为容器,而不可以进行增删改查操作
只有版本更新,我还没弄成功,这里就先不贴了,其实作为Android开发我觉得以上已经足以满足我们开发需求了,附上DBFLow官方文档
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'
第二,需要在build.gradle(Module :app)文件中添加
贴上代码
apply plugin: 'com.neenbedankt.android-apt'
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"
第三,需要创建一个application文件,在onCrete()方法中初始化
/** * Created by wangchang on 2016/3/19. */ public class myApplication extends Application{ @Override public void onCreate() { super.onCreate(); FlowManager.init(getApplicationContext()); }
这样整个配置就完成了,下面我们来看看如何使用
第一,创建数据库
我们需要自己创建一个数据库,定义数据库名称,版本号
/** * Created by wangchang on 2016/3/19. */ @Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION) public class DBFlowDatabase { //数据库名称 public static final String NAME = "DBFlowDatabase"; //数据库版本号 public static final int VERSION = 1; }
其次创建model文件
/** * Created by wangchang on 2016/3/19. */ @ModelContainer @Table(databaseName = DBFlowDatabase.NAME) public class UserModel extends BaseModel { //自增ID @Column @PrimaryKey(autoincrement = true) public Long id; @Column public String name; @Column public int sex; }
这里简单介绍下,必须继承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();//插入对象
当数据量比较大时,比如10000条数据这样保存就会很慢,这里对大数据就会用到事物,批量保存,
UserModel people = new UserModel(); ArrayList<UserModel> list=new ArrayList<>(); for (int i=0;i<10000;i++) { people.name = "张三"; people.sex = 1; list.add(people); } //实时保存,马上保存 new SaveModelTransaction<>(ProcessModelInfo.withModels(list)).onExecute(); //异步保存,使用异步,如果立刻查询可能无法查到结果 //TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)));
其次,就是查询了,这是个重点
当你要查询返回一个对象时
//返回单个查询结果 UserModel user = new Select().from(UserModel.class).querySingle();
当你要查询返回一个集合时
//返回所有查询结果 List<UserModel> peoples = new Select().from(UserModel.class).queryList();
这些是些简单的查询操作,当查询条件不满足一个时,我们该怎么做呢?
//查询gender = 1的所有People List<UserModel> peoples2 = new Select().from(UserModel.class).where( Condition.column(UserModel$Table.NAME).is("张三"), Condition.column(UserModel$Table.SEX).is(1)).queryList();
查询名字为张三,性别为1的人的集合,通过添加Condition.column来添加搜索条件
最后,怎么保存json数据到DBFlow呢
JSONModel<TestObject> jsonModel = new JSONModel<>(json, TestObject.class); // constructs an insert or update query based on the JSON contents jsonModel.save(false); // deletes a model based on the JSON contents jsonModel.delete(false);
这里需要注意一些限制
1.它们必须引用在相同数据库中已定义的数据表Model。
2.你无法对它们使用SELECT操作,因为它们并不是一个已存在的表,只是提供了一些方便的方法使它们看起来像一个Model。
3. 请确保被引用的表是正确的,因为它本身无法辨别表是否正确。
4.对于JSON/Map/Object,它并不是一个全功能的语法分析器,它只是一个简单、好用的数据容器。
就是说这里只是保存json数据到本地,数据库仅作为容器,而不可以进行增删改查操作
只有版本更新,我还没弄成功,这里就先不贴了,其实作为Android开发我觉得以上已经足以满足我们开发需求了,附上DBFLow官方文档
DBFLow官方文档
相关文章推荐
- Android 中外部存储在不同android版本上面的位置
- Android基础
- Android官方开发文档Training系列课程中文版:构建第一款安卓应用之入门指南
- Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
- Android之线程池深度剖析
- 十一、Android的线程和线程池
- 十、Android的消息机制
- 图文讲解Android的ImageView类中的ScaleType属性设置
- Android Studio 报错 plugin is too old
- android 仿ios列表头可以停靠在列表顶部的列表PinnedHeaderListView
- android图片的三级缓存
- android 获得焦点并弹出软键盘
- 【LatinIME】默认开启键盘按键声
- android AndFix热补丁框架(不发版本,修复线上bug)
- Android日期相关函数的工具类
- 七、Android动画
- Android中使用Bitmap类将矩形图片转为圆形的方法
- Android-屏幕适配全攻略(绝对详细)(二)
- android中内存泄漏和内存溢出的区别
- android相机和相册