关于Android数据库orm工具库对比的几点思考(四)

本文详细介绍了ActiveAndroid,一个轻量级的Android ORM框架,包括配置、Model创建、增删改查操作。文章对比了ActiveAndroid与其他ORM框架如ORMLite和greenDAO的优缺点,讨论了ActiveAndroid的性能和适用场景,提供了数据库操作的实例,有助于开发者选择适合的Android数据库解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ActiveAndroid的简介

ActiveAndroid
Android Sqlite orm 的 db 工具类
项目地址:https://github.com/pardom/ActiveAndroid
文档介绍:https://github.com/pardom/ActiveAndroid/wiki/_pages

ActiveAndroid算是一个轻量级的ORM框架,简单地通过如save()和delete()等方法来做到增删改查等操作。配置起来也还算简单。但是有心的人会发现,进入github会看到,这个框架最后提交是在2014年7月,也就是说已经距离现在已经两年没有更新了,那,有人又会奇怪了,为什么已经没有更新的框架我还要拿来写文,原因无他,它之前火过,我们总是追求更快更好更新顺应时代的事物,然而这些都是源于之前的对比,才会不断推陈出新,所以,今天的主角我选择它。

二、ActiveAndroid的使用

(一)配置

在AndroidManifest.xml中需要添加数据库名和版本号。

  • AA_DB_NAME (数据库名,这个name不能改,但是是可选的,如果不写的话 是默认的”Application.db”这个值)
  • AA_DB_VERSION (默认是1)
<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>

在AndroidManifest.xml文件中指定application元素的name为 com.activeandroid.app.Application,如果需要自定义Application,需要让你的Application对象继 承自com.activeandroid.app.Application而不是android.app.Application。

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

如果你需要继承其他库 的Application,则需要在Application中初始化和处理ActiveAndroid。如上,ActiveAndroid.initialize(this);做初始化工作,ActiveAndroid.dispose();做清理工作。

(二)创建model

@Table(name = "Items")
public class Item extends Model {
    // 这样可以避免重复
    @Column(name = "remote_id", unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
    public int remoteId;
    @Column(name = "Name")
    public String name;
    @Column(name = "Category")
    public Category category;
    // 确保每个model类中都有一个默认的构造方法
    public Item(){
       super();
    }
    public Item(String remoteId, String name, Category category){
        super();
        this.remoteId = remoteId;
        this.name = name;
        this.category = category;
    }
}

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

这个Item类中包含了一个Category类型的对象,这其中又包含了一个Entry对象。

@Table(name = "Categories")
public class Category extends Model {
    @Column(name = "remote_id", unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
    public int remoteId;
    @Column(name = "Name")
    public String name;
    @Column(name = "Entry")
    public Entry entry;
    public Category(){
       super();
    }
    public void saveEntry() {
        if (entry != null) {
            entry.save();
        }
    }
    public List<Item> data;
    // 使用外键,实现一对多存储
    public List<Item> items() {
        data = getMany(Item.class, "Category");
    }
}
@Table(name = "Entrys")
public class Entry extends Model {
    @Column(name = "Name")
    public String name;
}

在这个框架中,一个对象中包含一个List对象,其实就是把List对象全部存到另一个表里,通过外键来关联。

(三)增删改查

保存和更新数据到数据库

1. 单条插入
保存一条记录,只需要创建一个模型的实例,并为每个字段指定值,然后调用save()方法。

Category restaurants = new Category();
restaurants.name = "Restaurants";
restaurants.save();

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

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();
}

这里需要注意的是Item类中包含Category对象,Category类中包含Entry对象。必须先保存Entry对象,Entry对象会得到一个Id,然后才能存储Category对象,否则Category对象中的Entry对象就会为null。

删除记录

我们有三种方式删除一条记录
调用delete()方法就可以删除一条记录,下面的例子中,通过id加载一个Item对象,并且删除他。

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

也可以通过静态方法删除

Item.delete(Item.class, 1);

也可以创建调用Delete对象删除

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

更新记录

new Update(Person.class).set("age=?," + "name=?", age, name).execute();

查询数据库

1.查询一条

public static Item getRandom(Category category) {
    return new Select()
        .from(Item.class)
        .where("Category = ?", category.getId())
        .orderBy("RANDOM()")
        .executeSingle();
}

2.查询所有

public static List<Item> getAll(Category category) {
    return new Select()
        .from(Item.class)
        .where("Category = ?", category.getId())
        .orderBy("Name ASC")
        .execute();
}

执行一个Select方法,指定表Item.class,限定条件where(“Category = ?”, category.getId()),排序为orderBy(“Name ASC”),取出个数为limit(num)
当然还支持其他非常多的指令。

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

具体使用还是看自己的需求咯!

三、世纪大对比

1.ActiveAndroidOrmLite

作为一个轻量级的ORM框架,在快速开发中,应用起来还是很方便的,比ORMLite要简单一些,但某些细节不如ORMLite更强大,不如对象中包含对象时,ORMLite中可以有参数设定自动创建,而不是需要我们手动执行下sava,也许在ActiveAndroid中也可以这样,但目前我没搞明白注解中另几个属性的意思。整体性能经测试(100条Category数据,300条Item数据,100条Entry数据)存储耗时1.1s-1.2s,与ORMLite是持平的,但也许是测试数据太小了,没有说服性,有时间可以进行10w条数据的测试。

2.ActiveAndroidRealm

ActiveAndroid,这是一个很传统的ORM框架,不过无论是与Gson的配合使用,还是连接查询或者分页查询,传统数据库的理念它都能支持的很好。无奈的是这个项目在GitHub上的最近更新时间还是在两年前,它对AndroidStudio的InstantRun特性支持的不是很好,强行使用的话可能会报错误。
第二点是它的版本升级策略做的不好,不能做到跨版本升级,目前的做法只能是升级APP的后如果检测到先前的版本就卸载然后重装,原先的数据只能丢失了。这样简单粗暴的做法自然不是长久之计。
第三点是不能查询个别列,将所有字段都查出来既浪费时间,又浪费空间。

Realm,效率高,因为是自己实现的C++数据库,与SQLite底层使用java不同,它天生就比其高效快速。维护Realm数据库还能带来平台无关性,iOS、Android等平台都可以共享数据库。
Auto-Refresh,Realm为每个实体创建了代理类,并且实现了其Getter/Setter,因此,每次得到或者修改实体的值,都是直接对底层数据库进行的操作。

3.GreenDaoORMLite

简单的讲,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

优点:
1.greenDAO 性能远远高于同类的 ORMLite
2.greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
3.与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。

缺点:
学习成本较高。其中使用了一个Java工程根据一些属性和规则去generate一些基础代码,类似于javaBean但会有一些规则,另外还有QueryBuilder、Dao等API,所以首先要明白整个过程,才能方便使用。没有ORMLite那样封装的完整,不过greenDao的官网上也提到了这一点,正是基于generator而不是反射,才使得其效率高的多。

ormlite是基于注解和反射的的方式,导致ormlite性能有着一定的损失(注解其实也是利用了反射的原理)

优点:
文档较全面,社区活跃,有好的维护,使用简单,易上手。

缺点:
基于反射,效率较低

四、总结

相信以上的对比,有基本了解过这些框架的话,心里就会有个大概,至于到底选择哪个框架运用于项目中,具体问题具体分析,贪多嚼不烂,选择最适合项目的是为首要条件,关于android orm数据库框架的介绍就在此告一段落了,后续会更新其他方面的博文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值