用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端
最近开发的一个项目主要有两个特点,这两点也是在项目开发前需要着重去规划解决方案的:
- 需要和Rest服务端请求大量的数据
- 同时这些数据本地也要保存到sqlite数据库
SugarORM简介
要说SugarORM之前不得不说ORM。ORM(Object-Relational Mapping)即对象关系映射模式,是Java开发中常用的技术。它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。因为Android开发也是用Java语言,所以Android平台上涌现了一些Android的ORM框架,比如ORMLite、GreenDao、SugarORM,ORMLite并不是专为Android打造的,GreenDao据称性能比较高,但是有重大的缺陷,这里后面会说到。所以最后选用了SugarORM这个框架,同时SugarORM一直在更新维护,所以也推荐使用这个框架。
- 不用写复杂的sql语句,而用简单的API即可完成创建和操纵数据
- 可以在原有的Bean上仅仅添加小的修改而复用Bean
- 简化而明了的数据库设计和创建过程,同时提供表的一对多的支持
SugarORM的操作
通过在gradle中添加下列依赖来导入SugarORM:
compile 'com.github.satyan:sugar:1.3'
SugarContext.init(this);
SugarContext.terminate();
<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>
- 创建的数据库db的文件名,将在/data/data/{你的应用包名}/databases下创建对应的文件
- 数据库版本号
- 是否允许SugarORM记录log
- 创建数据库表对应的Bean所在的包的路径
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的属性名所采用驼峰命名法,那么大写的字母会在创建的表中字段转换成下划线。比如spuId这个属性对应的表中的字段名为spu_id
- 之所以实现Serializable是因为这个Bean在代码中不仅仅为SugarORM创建表而服务,同时也是为了能在Android组件中传递(比如Handler中的message.obj)而用,所以这里和官网的直接继承自SugarRecord<T>不同,推荐大家用我这种方式
- @Column这个注解意思是说你想强制按照你的规定的名字来创建表中对应的字段名字,所以这里的skuId在Goods表中的字段名就不是默认的sku_id了,而是你自己给的sku_ID
- @Expoes是来自于Gson的的一个注解,后面会说到
- @Ignore这个注解强调这个属性在表中不要创建对应的字段
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的条件查询操作
Goods.find(Goods.class, "name = ? and skuId = ?", "Coffee", "123");
find(Class<T> type, String whereClause, String[] whereArgs, String groupBy, String orderBy, String limit)
List<Note> notes = Note.findWithQuery(Note.class, "Select * from Note where name = ?", "satya");
Select.from(TestRecord.class)
.where(Condition.prop("test").eq("satya"),
Condition.prop("prop").eq(2))
.list();
SugarORM的一对多使用
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;
    }
}
: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数据,那么就有问题了。
开发中注意的地方
- 命令问题
- 数据库更改的问题
用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端的更多相关文章
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题
		庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ... 
- tomcat cluster session同步时保存map数据遇到的问题
		Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 ... 
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 大数据支持分表优化
		公司的短信平台,数据量越来越大了,需要对数据进行一些优化,下面是拆分后的数据库量参考. 新开发的软件模块,必须支持分表,拆表的功能一个数据表里,不适合保存1000万以上的记录新开发的业务模块,能分表的 ... 
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 省市区数据权限的实现效果
		折腾了2-3周,终于把全国网点数据权限,省.市.县数据规范化,查询权限规范化,基础数据规范化的思路理清楚了, 今天应该是一个里程碑式的一天 省市区数据规范化后 1:网点的基础数据可以更加严谨规范化. ... 
- 快速开发MQTT(一)电子工程师眼中的MQTT
		转载:https://zhuanlan.zhihu.com/p/54669124 DigCore 主页http://www.digcore.cn 文章首发于同名微信公众号:DigCore 欢迎关注同名 ... 
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 大型软件系统客户端数据同步的问题解决
		作为一个完整的整体信息化解决方案需要有足够强大的各种功能,这些功能相对独立,又互相依存.当有需要这样的功能时可以随时拿出来用,适当修改一下就可以满足要求.只有这样才能快速开发各种信息化系统,才能满足各 ... 
- Microsoft Sync Framework下的快速开发同步程序
		Microsoft Sync Frameworks简称MSF,是一个综合的同步平台,MSF支持应用程序,服务,设备的在线以及离线同步.MSF主要有以下几个部件组成: * Sync Servic ... 
- Android快速开发系列 10个常用工具类
		转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅 ... 
- 【转】 Android快速开发系列 10个常用工具类 -- 不错
		原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ... 
随机推荐
- Struts中的OGNL和EL表达式笔记
			Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ... 
- ISO9126软件质量模型
			ISO9126软件质量模型,是评价软件质量的国际标准.6个特性27个子特性组成. ISO/IEC9126软件质量模型是一种评价软件质量的通用模型,包括3个层次: 1.质量特性 2.质量子特性 3.度量 ... 
- CI框架SESSION重写
			这个是我平时用的是 PHP 自己的 Session 机制,是真正的 PHP Session,存储在服务器端,而不是用的 cookie 接口完全兼容于 CI 2.0.x 的 Session 类库,也就是 ... 
- SQL Server 在windows server2008外网服务器远程连接设置
			方法如下: 一.为 SQL Server 2005 启用远程连接 1. 单击"开始",依次选择"程序"."Microsoft SQL Server ... 
- cocos2d-x之xml文件读取初试
			auto doc=new tinyxml2::XMLDocument(); doc->Parse(FileUtils::getInstance()->getStringFromFile(& ... 
- zju 1937 初涉——深度优先搜索
			#include "stdio.h" int a[11],b[11]; int k,flag,n,s; void DFS(); int main() { int i; while( ... 
- DW Basic Knowledge2
			DW的元数据是指除去数据本身之外的所有信息. 围绕DBMS方面的元数据可以描述为表定义,分区设置,索引视图定义,以及DBMS级安全方面的特权 与授权等内容. 在任何场合下,ODS要么是一个处在OLTP ... 
- Linux 系统常用命令汇总(六) 文件打包与压缩
			文件打包与压缩 命令 选项 注解 示例 compress 文件名 压缩指定的文件,压缩后的格式为*.z compress install.log -d 解压被压缩的文件 .z为后缀的文件:compr ... 
- 广搜+打表 POJ 1426   Find The Multiple
			POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ... 
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
			Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ... 
