ActiveAndroid--Android轻量级ORM框架

来源:互联网 发布:郭靖 知乎 编辑:程序博客网 时间:2024/06/10 11:26


发表于8个月前(2013-06-13 19:55)   阅读(3051) | 评论(8126人收藏此文章,我要收藏
赞1
androidsqlite ActiveAndroid

目录[-]

  • 开始
  • 创建数据库模型
  • 依赖关系的数据库表
  • 如何保存和更新数据到数据库
  • 单挑插入
  • 批量插入
  • 删除记录
  • 查询数据库
  • 源博客链接:http://linkyan.com/2013/05/about-activeandroid/

    Github:ActiveAndroid

    ActiveAndroid算是一个轻量级的ORM框架,简单地通过如save()和delete()等方法来做到增删改查等操作。配置起来也还算简单。

    下面是作者的原话:

    ActiveAndroid is an active record style ORM (object relational mapper). What does that mean exactly? Well, ActiveAndroid allows you to save and retrieve SQLite database records without ever writing a single SQL statement. Each database record is wrapped neatly into a class with methods like save() and delete().

    ActiveAndroid does so much more than this though. Accessing the database is a hassle, to say the least, in Android. ActiveAndroid takes care of all the setup and messy stuff, and all with just a few simple steps of configuration.

    开始

    在AndroidManifest.xml中我们需要添加这两个

    • AA_DB_NAME (这个name不能改,但是是可选的,如果不写的话 是默认的"Application.db"这个值)

    • AA_DB_VERSION (optional – defaults to 1)


      1...
      2<meta-data android:name="AA_DB_NAME"android:value="your.db" />
      3<meta-data android:name="AA_DB_VERSION"android:value="5" />


    这个<application>是必须指定的,但你也可以使用自己的Application,继承自com.activeandroid.app.Application

    1public classMyApplication extends com.activeandroid.app.Application { ...

    如果你不想或者不能继承com.activeandroid.app.Application的话,那么就这样

    01public classMyApplication extends SomeLibraryApplication {
    02@Override
    03public voidonCreate() {
    04    super.onCreate();
    05    ActiveAndroid.initialize(this);
    06}
    07@Override
    08public voidonTerminate() {
    09    super.onTerminate();
    10    ActiveAndroid.dispose();
    11}
    12}

    ActiveAndroid.initialize(this);做初始化工作,ActiveAndroid.dispose();做清理工作

    创建数据库模型

    我们使用@Table(name = "Items")来表示表,使用@Column(name = "Name")来表示列,ActiveAndroid会使用自增长的ID作为主键,然后按照注解描述,将类对应映射为数据库表。

    01@Table(name ="Items")
    02public classItem extends Model {
    03@Column(name ="Name")
    04public String name;
    05@Column(name ="Category")
    06public Category category;
    07    publicItem(){
    08            super();
    09    }
    10    publicItem(String name, Category category){
    11            super();
    12            this.name = name;
    13            this.category = category;
    14    }
    15}

    依赖关系的数据库表

    假如Item和Category是多对一的关系,那么我们可以这样子创建他们的类

    01@Table(name ="Items")
    02public classItem extends Model {
    03@Column(name ="Name")
    04public String name;
    05@Column(name ="Category")
    06public Category category;
    07}
    08 
    09<!-- lang: java -->
    10@Table(name ="Categories")
    11public classCategory extends Model {
    12@Column(name ="Name")
    13public String name;
    14public List<Item> items() {
    15    returngetMany(Item.class,"Category");
    16}
    17}

    如何保存和更新数据到数据库

    单挑插入

    保存Category对象

    1Category restaurants = newCategory();
    2restaurants.name = "Restaurants";
    3restaurants.save();

    分配了一个category并且保存到数据库

    1Item item = newItem();
    2item.category = restaurants;
    3item.name = "Outback Steakhouse";
    4item.save();

    批量插入

    如果你要批量插入数据,最好使用事务(transaction)。

    01ActiveAndroid.beginTransaction();
    02try {
    03        for(int i = 0; i < 100; i++) {
    04            Item item =new Item();
    05            item.name ="Example " + i;
    06            item.save();
    07        }
    08        ActiveAndroid.setTransactionSuccessful();
    09    }
    10finally {
    11    ActiveAndroid.endTransaction();
    12}

    使用事务的话只用了 40ms,不然的话需要4秒。

    删除记录

    我们有三种方式删除一条记录

    1Item item = Item.load(Item.class,1);
    2item.delete();
    3 
    4 
    5<!-- lang: java -->
    6Item.delete(Item.class,1);
    7 
    8<!-- lang: java -->
    9new Delete().from(Item.class).where("Id = ?",1).execute();

    很简单吧

    查询数据库

    作者将查询做的非常像SQLite的原生查询语句,几乎涵盖了所有的指令
    com.activeandroid.query包下有以下类

    • Delete
    • From
    • Join
    • Select
    • Set
    • Update

    我们举例说明吧

    1public staticItem getRandom(Category category) {
    2    returnnew Select()
    3        .from(Item.class)
    4        .where("Category = ?", category.getId())
    5        .orderBy("RANDOM()")
    6        .executeSingle();
    7}

    对应的sqlite查询语句就是 select * from Item where Category = ? order by RANDOM()
    当然还支持其他非常多的指令

    • limit
    • offset
    • as
    • desc/asc
    • inner/outer/cross join
    • group by
    • having
      等等

    大家可以在ActiveAndroid项目下的tests工程找到测试用例,有非常多详细的描述。

    0 0
    原创粉丝点击