Android高性能ORM数据库DBFlow入门

DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点。同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后。基于注解,使用apt技术,在编译过程中生成操作类,使用方式和ActiveAndroid高度相似,使用简单。

特性:

1、无缝支持多个数据库;

2、使用annotation processing提高速度;

3、ModelContainer类库可以直接解析像JSON这样的数据;

4、增加灵活性的丰富接口。

github仓库:https://github.com/Raizlabs/DBFlow

DBFlow在国内可能用的人不是很多,所以中文介绍很少,所以就有了这篇文章,接下来就让我们一起学习DBFlow。

一、引入依赖、初始化

需要引入apt和maven,配置项目的 build.gradle

buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.0.0-beta6'classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'}
}allprojects {repositories {jcenter()maven { url "https://jitpack.io" }}
} 

配置app的build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
def dbflow_version = "3.0.0-beta4"
android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "cn.taoweiji.dbflowexample"minSdkVersion 14targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"
} 

需要在Application的onCreate对DBFlow进行初始化

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();FlowManager.init(this);}
} 

记得修改AndroidManifest.xml

<applicationandroid:name=".MyApplication"
../>

二、数据库创建、表创建

定义数据库

我这里定义了一个名称叫做AppDatabase的数据库,可以根据自己的喜欢进行定义。

@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
public class AppDatabase {//数据库名称public static final String NAME = "AppDatabase";//数据库版本号public static final int VERSION = 1;
} 

创建数据库对象

必须继承BaseModel,BaseModel包含了基本的数据库操作(save、delete、update、insert、exists),看下面代码可以发现这个表是关联上面定义的数据库,People的id是自增的id。

@ModelContainer
@Table(database = AppDatabase.class)
public class People extends BaseModel {//自增ID@PrimaryKey(autoincrement = true)public Long id;@Columnpublic String name;@Columnpublic int gender;
} 

编写完数据表对象后,点击Android studio的build->Make Project(Mac的童鞋直接command+F9)就会使用apt进行了编译,

查看目录(我的people类放在cn.taoweiji.dbflowexample.db)

app/build/generated/source/apt/debug/cn/taoweiji/dbflowexample/db

就可以看到自动生成 People_Adapter、People_Container、People_Table,其中People_Table在后面使用有很大的作用,建议详细看看它的结构。

注意

如果配置好了后,Make Project后,却没有生成_Table, GeneratedDatabaseHolder, _DataBase, _Adapter等,检查都无误后,可以检查一下:

android {compileSdkVersion 23buildToolsVersion "23.0.2"}

参考链接:体验Android ORM之DBFlow - 漫漫求学中的孩儿 - 博客频道 - CSDN.NET

三、增删改

由于数据表对象继承了BaseModel,已经包含了很多的操作

People people = new People();
people.name = "Wiki";
people.gender = 1;
people.save();
//people.update();
//people.delete();
Log.e("Test", String.valueOf(people.id));

删除、更新等操作就自己体验,这里就不多说了。

四、查询

//返回所有查询结果
List<People> peoples = new Select().from(People.class).queryList();
//返回单个查询结果
People people = new Select().from(People.class).querySingle();
//查询gender = 1的所有People
List<People> peoples2 = new Select().from(People.class).where(People_Table.gender.eq(1)).queryList(); 
DBFlow的查询方式借鉴ActiveAndroid的,但是比ActiveAndroid功能还要强大。

四、事务、批量保存

事务是一个数据必须具备的,如果保存10000条数据,一条一条保存必然是很慢的,所以就需要用到事务,批量保存。DBFlow的事务非常的强大,同时使用也很复杂,这里就简单介绍批量保存,更多内容请查看官方文档

https://github.com/Raizlabs/DBFlow/blob/master/usage/Transactions.md

List<People> peoples = new ArrayList<>();
for (int i = 0; i < 1000; i++) {People people = new People();people.name = "Wiki";people.gender = 1;peoples.add(people);
}
//实时保存,马上保存
new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)).onExecute();
//异步保存,使用异步,如果立刻查询可能无法查到结果
//TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples))); 

五、数据库升级(增加表、增加字段等)

如果是新增表无需做特别的处理,直接修改AppDatabase的版本号即可。

如果需要新增字段,除了需要修改AppDatabase的版本号外,还需要做特殊的处理,DBFlow的描述是:Migrations。

例子:对People新增一个email字段

第1步,修改数据库版本号

@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
public class AppDatabase {//数据库名称public static final String NAME = "AppDatabase";//数据库版本号,这里修改2public static final int VERSION = 2;
} 

第2步,需要修改数据表对象结构,增加email

@ModelContainer
@Table(database = AppDatabase.class)
public class People extends BaseModel {//自增ID@PrimaryKey(autoincrement = true)public Long id;@Columnpublic String name;@Columnpublic int gender;@Columnpublic String email;
} 

第3步,执行第二步之后,需要build(Android studio的build->Make Project、Mac的童鞋直接command+F9),通过apt更新People_Table,接下来编写Migrations

@Migration(version = 2, database = AppDatabase.class)
public class Migration_2_People extends AlterTableMigration<People> {public Migration_2_People(Class<People> table) {super(table);}@Overridepublic void onPreMigrate() {addColumn(SQLiteType.TEXT, People_Table.email.getNameAlias().getName());}
} 

类名可以更加自己喜欢定义,我个人的规则是,按照数据库版本号和需要更新的数据表来命名,需要注意是:version = 2

数据库升级就大功告成了。

总结:这篇文章只是简单介绍了DBFlow的基本功能使用,DBFlow还有很多很厉害的功能,比如多数据库支持、Powerful Model Caching等,而且还支持Kotlin语言(运行在Java虚拟机的新语言)。我只使用过greenDAO、activeAndroid、afinal、DBFlow数据库,所以在我看来,DBFlow是我用过的数据库当中最好用的数据库,性能也很好,使用非常简单,高度推荐。

我在github上共享一下DBFlow的配置

https://github.com/taoweiji/DBFlowExample

原文链接

Android高性能ORM数据库DBFlow入门 - 陶伟基Wiki - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不值钱的软件人才[转]

软件人才在中国不值钱&#xff0c;不但价格只比“一文不值”多一点&#xff0c;而且地位也就是一个普通劳动者&#xff0c;和高薪等挂不上钩。这里讲的是中国大陆地区&#xff0c;因为我不知道其他国家的情况&#xff0c;如无特殊声明&#xff0c;以下所有情况均只中国大陆的情…

科学:揭示自由意志的生物学本质

来源&#xff1a;中国科学报摘要&#xff1a;神经科学家开始精确定位大脑中参与自由意志感知的区域。“外星人肢体综合征”听起来也许并非那么像外星人的事&#xff0c;虽然它仍然很怪异。病人们抱怨说&#xff0c;他们的一只手变成了“流氓”&#xff0c;会在自己不知道的情况…

ThinkPHP入门

ThinkPHP项目的创建 <?php include "../../ThinkPHP/ThinkPHP.php"; 在index.php中导入ThinkPHP.php即可&#xff0c;会自动创建目录。 tp创建流程分析 1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.Common/runtime.php;3. ThinkPHP/…

解密:LL与LR解析 2(译,完结)

由于GFW&#xff0c;我无法联系到作者&#xff0c;所以没有授权&#xff0c;瞎翻译的。原文在这里[http://blog.reverberate.org/2013/07/ll-and-lr-parsing-demystified.html]。 这是第2部分和完结。 3. 解析树的形状 到目前为止&#xff0c;我们使用的算术表达式的那棵树&…

即时配送:新零售时代的“物流新战场”

来源&#xff1a;平安证券2018年8月2日&#xff0c;星巴克和阿里巴巴达成战略合作&#xff0c;共同推出外卖业务&#xff0c;为消费者配送旗下饮料和烘焙食品。这意味着&#xff0c;以后可以在饿了么、手机淘宝等APP上点星巴克外卖了。其实&#xff0c;新零售、新业态的快速发展…

ThinkPHP入门(二)

smarty使用 smarty引入流程 1. 控制器IndexAction.class.phpfunction index()$this -> display(); (父类Action的display) 2. 父类ThinkPHP/Lib/Core/Action.class.phpfunction display()$this->view->display 3. ThinkPHP/Lib/Core/View.class.phpfunction displa…

雁栖湖会议研讨:计算机能代替程序员吗?

来源&#xff1a;科学网写不完的代码&#xff0c;熬不完的夜&#xff0c;进度总是赶不上变化。程序开发是一项既费时费力&#xff0c;又容易出错的工作。但当前持续涌现的软件工程大数据以及快速发展的人工智能技术&#xff0c;正使得软件自动化成为可能。通过程序合成、代码补…

在 Mac OS X Lion 下修改 Hosts 的四种方法

一名刚刚使用 Mac OS X Lion 系统的朋友问我怎么该系统下修改 Hosts 文件&#xff0c;说网上搜了很多办法都不管用&#xff0c;只要编辑 Hosts 文件就出现”你不是文件 hosts 的所有者&#xff0c;因此没有权限写到该文件”的提示&#xff0c;要解决这个权限问题又比较麻烦&…

Django环境配置

Django安装 #安装最新版本的Django $ pip install django #或者指定安装版本 pip install -v django1.7.1 项目创建 $ django-admin startproject my_blog建立Django app $ python manage.py startapp article运行程序 $ python manage.py runserver pip安装python模…

CCAI2018演讲实录 | 蒲慕明:脑科学与类脑机器学习

来源&#xff1a;人工智能前沿讲习班摘要&#xff1a;7月28-29日&#xff0c;由中国人工智能学会和深圳市罗湖区人民政府共同主办&#xff0c;马上科普承办的“2018 中国人工智能大会&#xff08;CCAI 2018&#xff09;”完美收官。大会第二天下午&#xff0c;中科院神经科学所…

Django搭建简易博客

Django简易博客&#xff0c;主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markdown与代码高亮 归档&#xff0c;AboutME和标签分类 搜索与ReadMore RSS与分页 需要添加的安装包 pip i…

HDU 4619 Warm up 2 (多校)

题意&#xff1a;在网格里面给定了 横&#xff0c;竖 两种多米诺骨牌&#xff0c;同向的不可以覆盖&#xff0c;不同向的可以覆盖&#xff0c;问你最多去掉多少个有覆盖的多米诺&#xff0c;使得网格内剩余的多米诺骨牌最多 解题思路&#xff1a; 一.搜索 &#xff08;1&…

工业智联网: 基本概念、关键技术与核心应用

来源&#xff1a;王飞跃科学网博客作者&#xff1a;王飞跃, 张军, 张俊, 王晓摘要&#xff1a;本文首先阐述了工业网联技术的演化过程&#xff0c;重点讨论了工业智联网产生的技术和时代背景.然后探讨了工业智联网的基本概念、内涵与应用领域。本文详细介绍了工业智联网的关键技…

JDBC链接

//1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar Connection con null; Class.forName( "org.gjt.mm.mysql.Driver" );// 加载驱动程序 con DriverManager.getConnection( "jdbc:mysql://DbComputerNameOrIPAddr:3306/DatabaseName", UserNa…

KMP算法学习

kmp算法完成的任务是&#xff1a;给定两个字符串O和f&#xff0c;长度分别为n和m&#xff0c;判断f是否在O中出现&#xff0c;如果出现则返回出现的位置。常规方法是遍历a的每一个位置&#xff0c;然后从该位置开始和b进行匹配&#xff0c;但是这种方法的复杂度是O(nm)。kmp算法…

生命或可在星际间传播

来源&#xff1a;中国科学报去年&#xff0c;当一颗美式足球场大小的雪茄形天体Oumuamua进入太阳系时&#xff0c;它并非仅仅让人们第一次看到了一块星际岩石。根据一项新的研究&#xff0c;这也支持了太空岩石通过在遥远的恒星系统之间运送微生物&#xff0c;从而在星际间传播…

操作系统(二): 进程与线程

操作系统(二): 进程与线程 本章解读 进程管理是操作系统重点中的重点&#xff0c;涵盖了操作系统中大部分的知识和考点。其主要包括四部分&#xff1a;进程与线程&#xff0c;处理器调度&#xff0c;同步与互斥&#xff0c;死锁。所以我准备分四个部分来解释这四个模块。进程与…

Nature最新研究:超9000学者每5天发1篇论文,这些高产作家背后的科研圈

来源&#xff1a;悟空智能科技发论文发论文发论文……你有没有想过&#xff0c;假如你能够一周发一篇论文&#xff0c;这样坚持10年甚至20年&#xff0c;你能成为全球最高产的学者吗&#xff1f;答案可能吓你一跳&#xff1a;不能。不但不能&#xff0c;你甚至连全球前10000名都…

PHPCMS V9 按浏览次数排行调用文章

作者&#xff1a;匿名 来源&#xff1a;老者工作室 浏览&#xff1a;1841次 2011-6-22 14:59:05 字号&#xff1a;大 中 小[摘要]PHPCMS V9&#xff08;简称V9&#xff09;采用PHP5MYSQL做为技术基础进行开发。V9采用OOP&#xff08;面向对象&#xff09;方式进行基础运行框架…

Android之WebView学习

WebView常用方法 WebSettings 在使用WebView前我们都要进行相关的配置&#xff0c;常见的操作如下&#xff1a; WebSettings settings mWebView.getSettings();settings.setJavaScriptEnabled(true); //支持javascriptsettings.setUseWideViewPort(true); //设置webv…