用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端

最近开发的一个项目主要有两个特点,这两点也是在项目开发前需要着重去规划解决方案的:

  1. 需要和Rest服务端请求大量的数据
  2. 同时这些数据本地也要保存到sqlite数据库

对于第一点,目前的Volley、Gson等框架既可以解决从服务端请求数据拉下Json数据并解析成java对象的全过程。但是对于第二点,就有点头疼了。按照以往的开发模式,我们要写一些操作sqlite数据库的代码,同时可能还需要用到什么查询数据库绑定到view上的东西,这里想到了很多Android提供的类:SqliteDataBase、DataHelper、CursorAdapter或者ContentResolver等等太多了,连我自己都弄不清了,每次做到这里都要去查一些原来的代码和网上资料

我们知道,那些长期的重复的代码,必将会被总结成一套简单的框架。那么对于保存数据库和取出数据这块,是否有更好的更简单的方式或者框架呢?答案是有的,就是SugarORM框架

SugarORM简介


要说SugarORM之前不得不说ORM。ORM(Object-Relational Mapping)即对象关系映射模式,是Java开发中常用的技术。它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。因为Android开发也是用Java语言,所以Android平台上涌现了一些Android的ORM框架,比如ORMLite、GreenDao、SugarORM,ORMLite并不是专为Android打造的,GreenDao据称性能比较高,但是有重大的缺陷,这里后面会说到。所以最后选用了SugarORM这个框架,同时SugarORM一直在更新维护,所以也推荐使用这个框架。

它具有下列优点:

  1. 不用写复杂的sql语句,而用简单的API即可完成创建和操纵数据
  2. 可以在原有的Bean上仅仅添加小的修改而复用Bean
  3. 简化而明了的数据库设计和创建过程,同时提供表的一对多的支持

SugarORM在github上的官网为:

http://satyan.github.io/sugar/index.html

SugarORM的操作


通过在gradle中添加下列依赖来导入SugarORM:

compile ‘com.github.satyan:sugar:1.3‘

同时在AndroidManifest.xml中的Application元素中添加下列meta-data:

    <applicationandroid:label="@string/app_name"android:icon="@drawable/icon"
    android:name="com.orm.SugarApp">
    .
    .
    <meta-dataandroid:name="DATABASE"android:value="sugar_example.db"/>
    <meta-dataandroid:name="VERSION"android:value="2"/>
    <meta-dataandroid:name="QUERY_LOG"android:value="true"/>
    <meta-dataandroid:name="DOMAIN_PACKAGE_NAME"android:value="com.example.bean"/>
    .
    .
    </application>

四个meta-data分别确定了:

  1. 创建的数据库db的文件名,将在/data/data/{你的应用包名}/databases下创建对应的文件
  2. 数据库版本号
  3. 是否允许SugarORM记录log
  4. 创建数据库表对应的Bean所在的包的路径

对于第四点需要强调一些,SugarORM是通过一个Bean文件来创建一个表的,比如你想在sugar_example.db中创建一个叫做Goods的表,那么你需要在上面你规定的com.example.bean中创建一个Goods.java的Bean文件,然后你编译运行的时候,会自动在db中创建了这个空表

这里具体说明细节:

比如你的Goods.java需要这么写:

public class Goods extends SugarRecord implements Serializable {
    /**
     * 货品编号
     */
    @Column(name = "sku_ID", unique = true)
    @Expose
    private String skuId;
    /**
     * 商品编号
     */
    @Expose
    private String spuId;
    /**
     * 规格
     */
    @Expose
    @Ignore
    private String specValue;
    /**
     * 货品名称
     */
    @Expose
    private String name;
    /**
     * 货号
     */
    @Expose
    private String bn;
    /**
     * 成本价,进价
     */
    @Expose
    private BigDecimal cost;
    /**
     * 售价
     */
    @Expose
    private BigDecimal price;
    public String getSkuId() {
        return skuId;
    }
    public void setSkuId(String skuId) {
        this.skuId = skuId;
    }
    public String getSpuId() {
        return spuId;
    }
    public void setSpuId(String spuId) {
        this.spuId = spuId;
    }
    public String getSpecValue() {
        return specValue;
    }
    public void setSpecValue(String specValue) {
        this.specValue = specValue;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBn() {
        return bn;
    }
    public void setBn(String bn) {
        this.bn = bn;
    }
    public BigDecimal getCost() {
        return cost;
    }
    public void setCost(BigDecimal cost) {
        this.cost = cost;
    }
    public BigDecimal getPrice() {
        return price;
    }
    public void setPrice(BigDecimal price) {
        this.price = price;
    }
}

这是一个描述一个商品的Bean,Sugar会自动的在db中创建Goods这个表,表中的字段和Goods.java中的属性名对应,这里注意几点:

  1. Bean的属性名所采用驼峰命名法,那么大写的字母会在创建的表中字段转换成下划线。比如spuId这个属性对应的表中的字段名为spu_id
  2. 之所以实现Serializable是因为这个Bean在代码中不仅仅为SugarORM创建表而服务,同时也是为了能在Android组件中传递(比如Handler中的message.obj)而用,所以这里和官网的直接继承自SugarRecord<T>不同,推荐大家用我这种方式
  3. @Column这个注解意思是说你想强制按照你的规定的名字来创建表中对应的字段名字,所以这里的skuId在Goods表中的字段名就不是默认的sku_id了,而是你自己给的sku_ID
  4. @Expoes是来自于Gson的的一个注解,后面会说到
  5. @Ignore这个注解强调这个属性在表中不要创建对应的字段

SugarORM通过save(),delete(),T.findbyid(),T.listAll()等API来简化数据库的增删改查操作:

增加一条数据:

Goods good = new Goods();
good.setName("Coffee");
good.setCost(new BigDecimal(30));
good.setBn("123456");
good.save();

查询一条数据:

Goods loadGood =Goods.findById(Goods.class,1);

查询所有的表中的条目:

List<Goods> goods =Goods.listAll(Goods.class);

更新一条数据:

Goods good2 = Goods.findById(Goods.class, 1);
good2.setName("Rice");
good2.save();

删除一条数据:

Goods good2 = Goods.findById(Goods.class, 1);
good2.delete();

删除表中所有的条目:

Goods.deleteAll(Goods.class);

SugarORM的条件查询操作


可以直接通过提供的find和findWithQuery进行查询:

Goods.find(Goods.class, "name = ? and skuId = ?", "Coffee", "123");

如果你有其他的比如groupby、orderby、limit等操作,具体的find的接口格式为:

find(Class<T> type, String whereClause, String[] whereArgs, String groupBy, String orderBy, String limit)

通过findWithQuery接口查询:

List<Note> notes = Note.findWithQuery(Note.class, "Select * from Note where name = ?", "satya");

SugarORM同时提供了条件查询的API,叫做Query Builder,目前还处于Beta版本:

Select.from(TestRecord.class)
.where(Condition.prop("test").eq("satya"),
Condition.prop("prop").eq(2))
.list();

SugarORM的一对多使用


通常开发中,一个表中的某个字段对应了另一个表,这个在java类中体现的就是一对多的关联的关系,这里SugarORM也是支持的。比如Goods表中有一个Operator的字段,它说明了负责这个商品的人

public class Operator extends SugarRecord implements Serializable {

    String userName;
    String gender;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

在Goods.java中可以加上这个Operator的属性,那么Goods表即也会加上这样的字段

public class Goods extends SugarRecord implements Serializable {
    ...

    private Operator operator;
    public Operator getOperator() {
        return operator;
    }
    public void setOperator(Operator operator) {
        this.operator = operator;
    }
...
}

下面是查询的方式:

List<Goods> goods = Goods.find(Goods.class, "operator = ?", new String{operator.getName()});

或者

Goods good = Goods.findById(Goods.class, 1);
Operator o = good.getOperator();

SugarORM中Bean可复用Gson的Bean


SugarORM最大的好处是,用于创建表的Bean是你自己可以定义的,这点相对于GreenDao而言是不言而喻的。GreenDao是自动帮你创建了bean类,但是如果这个Bean你又需要用来解析网络拉下来的Json数据,那么就有问题了。

我们知道Gson也是通过Bean对象来解析Json数据的,但是Gson支持在Bean中的属性上加一些注解(比如@Expose这个注解)。那么这里你可能想到解析Json所用的bean和储存数据库所用的bean能共用,那么这里的存储数据库的bean因为需要加一些gson或者别的框架的注解,就不能让ORM框架来自动生成了。所以, GeenDao没法使用。

开发中注意的地方


  • 命令问题
  • 数据库更改的问题

第一个问题是本文开头所提到的“Bean的属性名所采用驼峰命名法,那么大写的字母会在创建的表中字段转换成下划线”这个问题,从SugarORM公布的源码里面能看到它是自己加上的"_"而并不是一个bug,这里可能是为了想和java web的一些开发方式保持一致吧,或许是为了规避sqlite对大小写敏感而导致的各种问题而引入的这种策略。所以开发者在用SugarORM的时候要注意命名的改变。你在Bean中写了一个属性名,而数据库中的字段名并不是这个。当然了,这里可以通过@Column注解来搞定

第二个问题是一个习惯性问题。开发中由于不用直接操作SqliteDataBase这种类型的类了,所以多人同时开发的时候某个人提交代码的时候只是修改了他所负责的表的对应的Bean的结构,而这个时候你再更新代码在重新安装Apk后会发现报错,比如找不到某个表的字段的错。这个是因为表结构改了,所以你不得不先卸载原来的应用而重新安装apk。所以这里最好在多人开发的时候养成一个习惯:某个人修改了某个Bean后(即更新了表结构)一定要通知其他人

时间: 2024-11-11 03:12:14

用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端的相关文章

C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 大数据支持分表优化

公司的短信平台,数据量越来越大了,需要对数据进行一些优化,下面是拆分后的数据库量参考. 新开发的软件模块,必须支持分表,拆表的功能一个数据表里,不适合保存1000万以上的记录新开发的业务模块,能分表的全分表,否则,将来我们无法用其他小型数据库,例如mysql 现在系统的短信已经进行了拆表接着打算把日志也进行拆表确保数据库里,没有庞大的表,随时可以切换数据库 每个人把自己负责的事情,做到自己能力的及至,做到部门能力的及至,公司能力的及至,就很有希望了有时候我说话很随意,但是一般会注意,我说出去的话

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题

庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2年的不断完善改进.又有保证性能.又有能保证性能.又支持自动升级的接近完美的客户端诞生了.在这个基础上开发任何业务模块都会方便很多,客户端支持手动同步基础技术.登录系统时后台自动同步数据等功能. 其实很多时候,难点不在于技术有多少深奥.在于稳定可靠.放心用,经得起大量客户端的参考考验. 把每一个点点滴

Microsoft Sync Framework下的快速开发同步程序

Microsoft Sync Frameworks简称MSF,是一个综合的同步平台,MSF支持应用程序,服务,设备的在线以及离线同步.MSF主要有以下几个部件组成:     * Sync Services for ADO.NET: 同步ADO.NET的数据     * Sync Services for FeedSync: 同步 RSS 和 ATOM 种子     * Sync Services for File Systems: 同步文件和文件夹     * Sync Framework Co

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 大型软件系统客户端数据同步的问题解决

作为一个完整的整体信息化解决方案需要有足够强大的各种功能,这些功能相对独立,又互相依存.当有需要这样的功能时可以随时拿出来用,适当修改一下就可以满足要求.只有这样才能快速开发各种信息化系统,才能满足各种客户的需求. 同步数据需要解决的问题主要有: 01:全国性大型集团公司的信息化改造项目会涉及到非常多的分公司网点的客户端需要同步数据的各种需求,这个已经超越了人工能处理好的极限.02:网点非常多时,往往由于业务的特殊性会有能离线作业的需要,网络故障.网络带宽不理想时都可以进行离线处理的工作流程需要

Android快速开发系列 10个常用工具类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java [java] view plaincopyprint? package com.zhy.utils; import android.util.Log;

流程管理与流程快速开发平台设计思路

1.前言 企业管理可能存在如下困惑: (1)无论如何进行分工方案的调整,依旧应对不了业务的变化,应对机制死板被动: (2)市场动态更新太快.形势复杂多变,管理漏洞百出,资源调配不合理,上下级沟通不畅影响效率: (3)流程反应速度太慢,满足不了客户需要,企业利润难以实现,流程重组乏力: (4)信息化系统烟囱林立,无法突破垂直管理壁垒: (5)没有一套适用的流程方案,难以建立优化体系,无法用有限的人力物力和时间达到最优利用 -- 咨询公司给出的方案: 企业在现代化发展中由于业务流程不合理,造成了多方

【转】 Android快速开发系列 10个常用工具类 -- 不错

原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java [java] view

基于Django快速开发可定制的办公系统实战(1):Git的使用

基于Django快速开发可定制的办公系统实战(1):Git的使用 ?为什么在项目的开篇要介绍下git的使用呢?俗话说:"工欲善其事,必先利其器",git工具就是项目开发的必备利器,尤其是在多人协作开发环境中.使用git工具可实现分布式的版本控制,可在服务端和本地创建一个版本库. ?脑图是本文的"脊椎",了解个大概后,再通读本文,再加上实际的操作,效果会更好,那我们就开始吧! 1 Git工具安装 Windows版本安装: 安装包下载地址:https://gitforw

Sublime插件库新成员基于APICloud快速开发跨平台App

互联网时代强调用户体验,那什么是HTML5跨平台App开发者的编程体验?"不剥夺.不替换开发者喜欢的开发工具,就是人性化的用户体验",APICloud给出了这样的答案! 重磅发布"多开发工具支持策略" "如果,你以为此次分享会APICloud只是讲解Eclipse开源插件代码经验,那就大错特错了!"APICloud CEO刘鑫以调侃的话进行了开场. 经过一年的上线摸索,APICloud团队充分的认识到"剥夺开发者已经习惯的开发工具,替换