热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidORM系列之ActiveAndroid

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

从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类

...>
    "com.activeandroid.app.Application" ...>

        ...

    

但是如果你项目中已经有了一个自定义的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结点下配置数据库名和数据库版本

 data
            android:name="AA_DB_NAME"
            android:value="Store.db"/>
        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类,多个用逗号分隔

 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 items() {
        return getMany(Item.class, "Category");
    }

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

数据的保存和修改

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

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

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

这里写图片描述
看下实体类,我们并没有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

这里写图片描述

如果要修改数据的话,对对应的类进行数据操作,调用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 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);
    }
}

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

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

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

" data-snippet-id="ext.8c0b2636e830f240cedd8000d89abeba" data-snippet-saved="false" data-csrftoken="xJUPnIX1-fAuD5zrUKjpg6vWr2q4F6Rhy8to" data-codota-status="done"> <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

推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
安韦苇8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有