从Java Web转到android的同学应该都知道ssh或者ssi,用惯了hibernate或者mybatis,转到android后找不到顺手的orm是不是感觉很不自在。其实android 中的orm还是很多的。

  • ActiveAndroid
  • SugarORM
  • Siminov
  • greenDAO
  • ORMLite
  • androrm
  • cupboard

本篇文章主要介绍一下ActiveAndroid的用法。用过LitePal的同学会发现,这两个框架的用法是如此的相似。

Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。

配置

首先新建一个android studio项目,加入ActiveAndroid的依赖。

repositories {    mavenCentral()    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:22.2.1'    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'}

如果你的项目中还没有自定义的Application类,那么可以直接在manifest文件中配置框架中的Application类

<manifest ...>    <application android:name="com.activeandroid.app.Application" ...>        ...    </application></manifest>

但是如果你项目中已经有了一个自定义的Application类,那么也没有关系。在onCreate方法中完成初始化,在onTerminate方法中完成清理工作。

public class App extends Application {    @Override    public void onCreate() {        super.onCreate();        ActiveAndroid.initialize(this);    }    @Override    public void onTerminate() {        super.onTerminate();        ActiveAndroid.dispose();    }}

在初始化之前可以调用对应函数开启日志

ActiveAndroid.setLoggingEnabled(true);

当然也可以用initialize的重载方法开启。

 ActiveAndroid.initialize(this,true);

然后在清单文件中指定该Application。并在application结点下配置数据库名和数据库版本

 <meta-data            android:name="AA_DB_NAME"            android:value="Store.db"/>        <meta-data            android:name="AA_DB_VERSION"            android:value="1"/>

当然你也可以在代码中指定,不过建议在清单文件中配置

 Configuration configuration=new Configuration.Builder(this)                .setDatabaseName("test.db")                .setDatabaseVersion(1)                .create();ActiveAndroid.initialize(configuration,true);

先生成两个实体类,让其继承Model 类,注意,如果要进行CRUD操作的话必须继承Model 类。然后通过@Table注解可以指定表名,@Column注解来指定列名。

@Table(name = "Category")public class Category extends Model {    @Column(name = "Name")    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Category{" +                "name='" + name + '\'' +                '}';    }}@Table(name = "Item")public class Item extends Model {    @Column(name = "Name")    public String name;    @Column(name = "Category")    public Category category;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Category getCategory() {        return category;    }    public void setCategory(Category category) {        this.category = category;    }    @Override    public String toString() {        return "Item{" +                "name='" + name + '\'' +                ", category=" + category +                '}';    }}

ActiveAndroid默认会查找所有Model的子类,可能会花去很长的时间如果我们有很多子类。为了加快应用的启动速度,我们可以在清单文件中直接指定model类,多个用逗号分隔

 <meta-data            android:name="AA_MODELS"            android:value="cn.edu.zafu.activeandroiddemo.model.Item, cn.edu.zafu.activeandroiddemo.model.Category" />

当然你也可以在代码中通过Configuration类来指定,不过同样的,还是建议在清单文件中配置

Configuration configuration=new Configuration.Builder(this)                .setDatabaseName("test.db")                .setDatabaseVersion(1)                .setModelClasses(Item.class, Category.class)                .create();ActiveAndroid.initialize(configuration,true);

我们看到Category 和 Item是一对多的关系。为了从Category方得到多的Item一方,我们在Category中增加一个方法,

 public List<Item> items() {        return getMany(Item.class, "Category");    }

如果你要指定某一列为索引,在对应的注解上加上index = true即可。

数据的保存和修改

接下来,我们来保存一条数据试试看。

Category category=new Category();category.setName("book");category.save();

用RE查看一下对应的存数据库的目录,打开对应的表,看下数据,确实已经存进去了。

Android ORM系列之ActiveAndroid_第1张图片
看下实体类,我们并没有id这个属性,为什么表中会有呢,其实这是自动生成的主键。

现在我们来保存几条item

Item item1=new Item();item1.setName("head first java");item1.setCategory(category);item1.save();Item item2=new Item();item2.setName("java core");item2.setCategory(category);item2.save();

看下Item表,其为我们自动生成了外键,指向了之前的category

Android ORM系列之ActiveAndroid_第2张图片

如果要修改数据的话,对对应的类进行数据操作,调用save方法即可。

事务的支持

当你有大量的数据插入时,这时候就要用到事务,ActiveAndroid也是支持事务的。

ActiveAndroid.beginTransaction();try {    //do something such as insert many data    ActiveAndroid.setTransactionSuccessful();}finally {    ActiveAndroid.endTransaction();}

数据的删除

根据id删除

Item.delete(Item.class,1);

当然你也可以直接调用delete

Item item = Item.load(Item.class, 1);item.delete();

也可以通过Delete类进行操作

new Delete().from(Item.class).where("Id = ?", 1).execute();

数据的查询

通过Select进行链式调用,更多查询的函数请读者自己体验

List<Model> execute = new Select().from(Item.class).where("Category = ?", 1).orderBy("name desc").execute();

类型序列号

ActiveAndroid 默认支持了很多类型,但是如果你想自定义处理序列化的类型,你也可以继承TypeSerializer 类,重写里面的四个方法即可。
比如我们要将Date类型转换为long类型保存,读取的时候又要转换为Date类型,则可以这样编写。

public class DateSerializer extends TypeSerializer {    @Override    public Class<?> getDeserializedType() {        return Date.class;    }    @Override    public Class<?> getSerializedType() {        return Long.class;    }    @Override    public Long serialize(Object data) {        if (data == null) {            return null;        }        return ((Date) data).getTime();    }    @Override    public Date deserialize(Object data) {        if (data == null) {            return null;        }        return new Date((Long) data);    }}

当然别忘了在清单文件中注册

<meta-data        android:name="AA_SERIALIZERS"        android:value="cn.edu.zafu.activeandroiddemo.serializer.DateSerializer,my.package.AnotherCustomeTypeSerializer"/>

同样也可以通过代码注册

Configuration configuration=new Configuration.Builder(this)                .setDatabaseName("test.db")                .setDatabaseVersion(1)                .setModelClasses(Item.class, Category.class)                .setTypeSerializers(DateSerializer.class)                .create();ActiveAndroid.initialize(configuration,true);

数据库升级

如果需要升级数据库,首先需要增加数据库版本号,必须比之前的大,即增大AA_DB_VERSION 属性。如果增加了新的实体类,它会自动增加到数据库中,但是如果你想改变已经存在的表,比如增加一列,首先你要修改实体类,然后你要在assets目录下创建sql语句的文件,文件名为数据库版本号,后缀是sql,里面写着升级语句,即你增加了什么列等。比如

ALTER TABLE Item ADD COLUMN color INTEGER;

将其保持为2.sql,放到assets目录下

使用ContentProvider

ActiveAndroid支持ContentProvider,但是必须复写默认的标识列如下所示(默认标识列是ID)。

@Table(name = "Category",id = BaseColumns._ID)

复写后的值是_id

当然不要忘记在清单文件中配置,之后你就可以使用了。

 <provider android:authorities="cn.edu.zafu.activeandroiddemo" android:exported="false" android:name="com.activeandroid.content.ContentProvider" />

源码下载

http://download.csdn.net/detail/sbsujjbcy/9026793

相关链接

  • https://github.com/codepath/android_guides/wiki/ActiveAndroid-Guide

更多相关文章

  1. android 应用程序数据共享shareuserid篇+ContentResolver+Conten
  2. ArcGIS for Android 离线数据编辑原理
  3. android 多媒体数据库详解
  4. android移动数据上网的开关的实现
  5. Android学习笔记-界面和数据存储以及一些零碎知识点

随机推荐

  1. 关于Android中定时周期执行线程方法
  2. 珍藏的Android电子书
  3. Android Studio:公司内网搭建Android stu
  4. Android(安卓)Launcher 动态icon【时钟】
  5. Android实用视图动画及工具系列之九:漂亮
  6. android.uid.system Android中如何修改系
  7. Android中的各种保活2-Android端外推送到
  8. Android通讯录实现联系人模糊查找
  9. ListView 滚动条
  10. 关于android receiver