Android开源库--ActiveAndroid(active record模式的ORM数据库框架)
Github地址:https://github.com/pardom/ActiveAndroid
前言
我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferences保存了,最近涉及到了消息推送历史,或者涉及到信息历史方面的东西,所以就需要用到了android的SQLlite,为了不重复造轮子,果断上github寻找轮子。
GreenDAO虽然效率最高,但由于每次都要手动生成代码,比较麻烦,所以弃用。
Couchbase也有Android版本,同时支持配合Couchbase Server同步,但使用的是nosql的数据库,所以弃用,但是后期可以研究研究。
ActiveAndroid是一个Active record模式的框架,几乎可以不用写任何SQL代码实现快速开发,就是它了!
简介
ActiveAndroid是一个active record模式的ORM框架,意味着不用写任何sql代码就能实现保存和检索SQLite数据库。
Active Record 模式
Active Record 模式出自 Martin Fowler 的《企业应用架构模式》一书。在 Active Record 模式中,对象中既有持久存储的数据,也有针对数据的操作。Active Record 模式把数据存取逻辑作为对象的一部分,处理对象的用户知道如何把数据写入数据库,以及从数据库中读出数据。
对象关系映射
对象关系映射(ORM)是一种技术手段,把程序中的对象和关系型数据库中的数据表连接起来。使用 ORM,程序中对象的属性和对象之间的关系可以通过一种简单的方法从数据库获取,无需直接编写 SQL 语句,也不过度依赖特定的数据库种类。
使用
1、获取类库
由于官方编译好的类库版本太久了,所以还是下载最新的源码使用gradle来构建jar类库,我已经编译好并且上传到附件了。
下载地址:http://files.cnblogs.com/files/leestar54/ActiveAndroid-jar.rar
下载完成,添加到libs即可,如果需要看文档和源码,则需要
2、配置
在AndroidManifest.xml的application节点添加2个meta-data字节点
<manifest ...>
<application android:name="com.activeandroid.app.Application" ...><meta-data android:name="AA_DB_NAME" android:value="Pickrand.db" />
<meta-data android:name="AA_DB_VERSION" android:value="5" />
</application>
</manifest>
分别代表数据库名称,版本。如果不添加,则使用默认值Application.db,1。
如果使用了自定义的Application,记得要初始化噢!
public class MyApplication extends SomeLibraryApplication {
@Override
public void onCreate() {
super.onCreate();
ActiveAndroid.initialize(this);
}
}
3、创建数据库模型
非常简单~以往要写一大堆SQL代码啊,只需创建一个类继承Model,使用注释标注相关字段(见https://github.com/pardom/ActiveAndroid/blob/master/src/com/activeandroid/annotation/Column.java)
没有ID?ActiveAndroid 已经帮我们自动创建了,见代码
@Table(name = "Items")
public class Item extends Model {
// If name is omitted, then the field name is used.
@Column(name = "Name", index = true)//如果需要设置这字段为索引,添加index=true即可。
public String name; @Column(name = "Category")
public Category category;
//如果定义了自己的构造函数,记得还要定义一个无参构造函数。
public Item() {
super();
} public Item(String name, Category category) {
super();
this.name = name;
this.category = category;
}
}
有这么一种关系,Items属于一个Category并且Categories包含许多Items,如何表示?也很简单。
@Table(name = "Categories")
public class Category extends Model {
@Column(name = "Name")
public String name; // This method is optional, does not affect the foreign key creation.
public List<Item> items() {
return getMany(Item.class, "Category");
}
}
注意:
ActiveAndroid会去遍历所有的文件来寻找Model类,这样的效率非常低,所以最好在AndroidManifest中添加一个meta-data,告诉ActiveAndroid你的Model类
<meta-data
android:name="AA_MODELS"
android:value="com.myapp.model.Item, com.myapp.model.Category" />
同时,不要使用以下的列名
ABORT DEFAULT INNER REGEXP
ACTION DEFERRABLE INSERT REINDEX
ADD DEFERRED INSTEAD RELEASE
AFTER DELETE INTERSECT RENAME
ALL DESC INTO REPLACE
ALTER DETACH IS RESTRICT
ANALYZE DISTINCT ISNULL RIGHT
AND DROP JOIN ROLLBACK
AS EACH KEY ROW
ASC ELSE LEFT SAVEPOINT
ATTACH END LIKE SELECT
AUTOINCREMENT ESCAPE LIMIT SET
BEFORE EXCEPT MATCH TABLE
BEGIN EXCLUSIVE NATURAL TEMP
BETWEEN EXISTS NO TEMPORARY
BY EXPLAIN NOT THEN
CASCADE FAIL NOTNULL TO
CASE FOR NULL TRANSACTION
CAST FOREIGN OF TRIGGER
CHECK FROM OFFSET UNION
COLLATE FULL ON UNIQUE
COLUMN GLOB OR UPDATE
COMMIT GROUP ORDER USING
CONFLICT HAVING OUTER VACUUM
CONSTRAINT IF PLAN VALUES
CREATE IGNORE PRAGMA VIEW
CROSS IMMEDIATE PRIMARY VIRTUAL
CURRENT_DATE IN QUERY WHEN
CURRENT_TIME INDEX RAISE WHERE
CURRENT_TIMESTAMP INDEXED RECURSIVE WITH
DATABASE INITIALLY REFERENCES WITHOUT
ID
4、增删查改
//增、改
Category restaurants = new Category();
restaurants.name = "Restaurants";
restaurants.save();
Item item = new Item();
item.category = restaurants;
item.name = "Outback Steakhouse";
item.save(); //删
Item item = Item.load(Item.class, 1);
item.delete();
Item.delete(Item.class, 1);
new Delete().from(Item.class).where("Id = ?", 1).execute(); //查,类似Builder的操作,具体看源码即可
public static Item getRandom(Category category) {
return new Select()
.from(Item.class)
.where("Category = ?", category.getId())
.orderBy("RANDOM()")
.executeSingle();
}
//事务
ActiveAndroid.beginTransaction();
try {
for (int i = 0; i < 100; i++) {
Item item = new Item();
item.name = "Example " + i;
item.save();
}
ActiveAndroid.setTransactionSuccessful();
}
finally {
ActiveAndroid.endTransaction();
}
5、预填充数据库
如果之前已经有数据库了,那么只需2步即可导入
(1)复制sql数据库到项目的assets目录,例如/myapp/src/main/assets/prepop.db
(2)确保manifest的AA_DB_NAME值与数据库名称一致,<meta-data android:name="AA_DB_NAME" android:value="prepop.db" />
部署之后,该数据库就会被挪至应用的/data/data/myapp/databases目录,虽然这会导致最后应用中会有一份数据库副本,占用应用大小。
为了确保自己的数据库能与ActiveAndroid好好工作,还需添加一个android_metadata表
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
INSERT INTO "android_metadata" VALUES ('en_US')
ActiveAndoird默认的主键标识名称为Id,所以如果models没有定义id列,要确保主键重命名为Id,但是如果是为了在ListView显示数据,建议设置主键列名为_id
@Table(name = "Items", id = "_id")
public class Item extends Model {
6、架构变动
有时候需要添加删除表的列
如果应用在开发阶段好办,直接在Model编辑删除之后重新安装即可。
如果是发布的产品,这时候就不能仅仅在model里面删除字段而已了,因为数据库已经生成了,这时候需要我们手动调整
(1)配置中AA_DB_VERSION 加1.
(2)新建一个<NewVersion>.sql,NewVersion就是AA_DB_VERSION 值,将文件添加到项目的assets/migrations目录
(3)ActiveAndroid将会执行NewVersion大于旧版本的SQL
示例:
在Items表中加入color列
2.sql
ALTER TABLE Items ADD COLUMN color INTEGER;
Android开源库--ActiveAndroid(active record模式的ORM数据库框架)的更多相关文章
- GitHub上排名前100的Android开源库介绍(来自github)
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...
- GitHub Top 100的Android开源库
摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介
转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...
- GitHub上排名前100的Android开源库介绍
GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...
- Android 开源库和项目 3
Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...
- Android 开源库获取途径整理
介绍眼下收藏 Android 开源库比較多的 GitHub 项目.站点.Twitter.App 及怎样获取最新的 Android 开源库. 微信号: 1. GitHub Android 开源项目汇总 ...
- 100个Github上Android开源库
项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...
随机推荐
- API文档管理工具-数据库表结构思考.
API文档管理工具-数据库表结构思考. PS: 管理工具只是为了方便自己记录API的一些基本信息,方便不同的开发人员 (App Developer, Restful API Developer)之间的 ...
- 查看Centos系统信息命令
linux命令行具有强大的功能,我们安装vps后,首先应该知道系统信息,查看这些信息,你会发现Linux命令很简单,你可以按照下面的命令练习. linux系统信息 # uname -a # 查看内核/ ...
- Windows7 64位安装配置Apache2.4+PHP5.4+MySQL5.5+Xdebug
PHP更新已经到了5.4.7了,之前是用PHPstudy安装的PHP5.2.13版本,今天有空,就把之前的集成安装卸载了.换上了新一代PHP,记录一下.. 环境:Windows7 64位(内部版本76 ...
- WinHex分析PE格式(1)
最近在一直努力学习破解,但是发现我的基础太差了,就想学习一下PE结构.可是PE结构里的结构关系太复杂,看这老罗的WiN32汇编最后一章 翻两页又合上了..把自己的信心都搞没了.感觉自己的理解能力不行, ...
- 常用的Python字符串常量
下面是一些常用的Python字符串常量string.digits:包含0-9的字符串string.letters:包含所有大小写字母的字符串 string.lowercase:所有小写字母string ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- sql连接字符串的方法
----乌龟代码---合并列值 --********************************************************************************** ...
- java 如何连接MySql数据库
利用jdbc方式连接数据库. 1.添加mysql驱动jar包 我用的是这个驱动包mysql-connector-java-5.1.26-bin.jar 添加方式: 2.加载MySql驱动类 priva ...
- Linux网络编程3——socket
宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...
- Python概述_软件安装_常见问题
1. Python安装 目前python有2个大版本,2和3,由于2和3语法有差别,现有的许多库都是基于python2开发,本系列文章以python2为主. 1.1 重要概念 1. 动态语言 运行 ...