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 {@Overridepublic 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-dataandroid: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    WITHOUTID

 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;

转载于:https://www.cnblogs.com/leestar54/p/4316135.html

Android开源库--ActiveAndroid(active record模式的ORM数据库框架)相关推荐

  1. GitHub 上排名前 100 的 Android 开源库介绍

    转自:http://www.codeceo.com/article/github-top-100-android-libs.html 本项目主要对目前 GitHub 上排名前 100 的 Androi ...

  2. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    本文转载于:https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 Gi ...

  3. GitHub上排名前100的Android开源库介绍

    摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然 ...

  4. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  5. 《Android开源库 ~ 1》 GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  6. GitHub上排名前100的Android开源库(201603)

    https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 GitHub 上 ...

  7. 【基础学习】GitHub 上100 的 Android 开源库分享

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择 (Best Match) 得到的结果, 然后过滤了跟A ...

  8. GitHub上排名前100的Android开源库

    转载于:https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 GitH ...

  9. 排名前100的Android开源库

    本项目主要对目前GitHub上排名前100的Android开源库进行简单的介绍,至于排名完全是根据GitHub搜索Java语言选择「BestMatch」得到的结果,然后过滤了跟Android不相关的项 ...

最新文章

  1. 计算机仿真和vr的区别,AR对比VR有何不同?你能分清楚他们的区别么
  2. mybatis整合spring下的的各种配置文件
  3. 判断远程图片是否存在,否则替换成默认图片
  4. 某高校2006年招收学生3千人c语言,C语言程序设计例题
  5. 简单暴力到dp的优化(入门篇)
  6. 如何在 Linux 中快速地通过 HTTP 提供文件访问服务
  7. 【Word 】隐藏功能生成特殊线
  8. 清华毕业生应聘“保姆”,年薪40万:她凭什么拿高薪?
  9. Ajax datatype:'JSON'的error问题Status1:200,JSON格式
  10. 词法分析器(分析C语言)
  11. 力克“中国智造”之道,亮相第七届工业数字化论坛
  12. c语言中断程序运行,C语言实现 软中断 程序小结
  13. c语言char str什意思,char *str与*str的区别
  14. 如何快速打出希腊字母
  15. 尼克 超级智能 路线_他山石|《超级智能》作者尼克·波斯特洛姆:超级智能将决定人类的未来...
  16. MPAndroidChart 饼状图 文字重叠问题完美解决
  17. android社交源码,原生仿微信社交社区即时通讯聊天双端APP源码开源 带PC客户端...
  18. Spring的下载及目录结构
  19. YOLOv5~目标检测模型精确度
  20. 在Windows Mobile 5,6 的设备上使用ActiveSync Remote Display

热门文章

  1. Android 网络权限配置
  2. 关键字:auto、static、register、const、volatile 、extern 总结
  3. LabView2018的安装
  4. android 8.0 iso6,微信8.0.6更新了什么?IOS系统微信8.0.6版本更新详情一览[多图]
  5. OpenCV图像处理(0)——文件夹批量读取文件
  6. socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例
  7. html表格怎样传入数据类型,Echarts图表中pie类型tooltip中formatter函数传递的参数从哪里来?...
  8. tinyint数据类型php筛选时怎么判断_PHP从入门到精通(三)PHP语言基础
  9. matlab 传递函数 画出频率响应,MATLAB环境下频率响应曲线的绘制方法
  10. python的多行语句可以使用反斜杠_Python的续行符:反斜杠\