SnappyDB—Android上的NoSQL数据库简介
参考:http://www.open-open.com/lib/view/open1420816891937.html
参考:http://android-arsenal.com/details/1/936
项目GIthub主页:https://github.com/nhachicha/SnappyDB#cookbook
在开发App的时候,经常需要缓存一些数据,不至于每次打开App都是空的,需要从网络下载数据。例如新闻客户端,需要缓存上次打开的新闻。
一般的做是使用SQLite数据库来保存数据,或者把数据序列化写到本地文件中。这两中方法,我在之前的项目中都用过。我先来说一下这两种方法的缺点:
- 使用SQLite数据库保存: 对于保存缓存数据来说,这样做未免太重量级了,存取数据都比较麻烦。当然,你还要知道SQL语法。小心设计数据库结构。对于相对复杂的数据,你还要设计多张表。还需要小心维护数据库的升级。
- 使用文件缓存: 写文件保存,需要你保存的数据都实现Serializable接口,当然,这不是什么大问题。你要维护你的文件内容结构。如果数据比较多,你可能要维护多个文件的读写。性能也是比较堪忧。
说了上面那些方法的缺点,自然是为了请出本文的主角——SnappyDB。
SnappyDB是一个键-值数据库,是非常流行的NoSQL数据库。可以保存任何基本类型和序列化(Serializable)安全的数据及其数组。
首先来看一下基本用法,如下:
DB snappydb = DBFactory.open(context); //create or open an existing databse using the default name
snappydb.put("name", "Jack Reacher");
snappydb.putInt("age", 42);
snappydb.putBoolean("single", true);
snappydb.put("books", new String[]{"One Shot", "Tripwire", "61 Hours"});
String name = snappydb.get("name");
int age = snappydb.getInt("age");
boolean single = snappydb.getBoolean("single");
String[] books = snappydb.getArray("books", String.class);// get array of string
snappydb.close();
可以看到使用非常方便,API简单到不用去学习。
另外,SnappyDB在保存和读取序列对象的时候,使用的是Kryo库,也Java内置序列化更快。更大的优势是,你并不要为数据去显式的去实现Serializable接口。这就意味着你以前的代码完全不要做任何改动。
Number[] array = {new AtomicInteger (42), new BigDecimal("10E8"), Double.valueOf(Math.PI)};
snappyDB.put("array", array);
更多API文档,请看官方的Cookbook。
再来看看性能,如下图:
可以看到,性能上甩SQLite几条街。
当然,SnappyDB在数据的稳定性上,还是有待验证的,应该是不如成熟的SQLite。多线程访问安全问题,作者也没有提到。但是从我们的需求(用来缓存数据)来看,SnappyDB应该是非常好的选择。其他例如realm-java,是一个比较严谨NoSQL的实现,还有简单轻量级的实现,如Couchbase-Lite-Android和SimpleNoSQL。
SnappyDB—Android上的NoSQL数据库简介的更多相关文章
- NoSql数据库简介及Redis学习
NO-Sql数据库:Not Only不仅仅是SQL 定义:非关系型数据库:NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据).这些类型的数据存储不需要固 ...
- NoSQL数据库--简介
一.What's NoSQL? NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库.这类数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的.原始的目的是为了大规模we ...
- NOSQL数据库简介
什么是NoSQL?泛指非关系型的数据库不支持SQL语法存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是Key-Value(即键值对关系)形式NoSQL的世界中没有一种通用的 ...
- NoSQL数据库简介与产生
关系型数据库所存在“问题” >利用ACID原则(原子性,一致性,隔离性,持久性)保证数据完整性: >行列的规范化存储: >预定义结构: >存储数据量“小”: >结构化查询 ...
- NoSQL之简介
简介 NoSQL(NoSQL=Not Only SQL),意即'不仅仅是"SQL".泛指非关系型的数据库.是一项全新的数据库革命性运动. 在现代的计算系统上每天网络上会产生庞大的数 ...
- 转:你需要知道的NoSQL数据库10件事
你需要知道的NoSQL数据库10件事 NoSQL的5个优势 1.弹性扩展 多年来,数据库管理员一直依赖于向上扩展(scale up)-随着数据库负载的增加购买更大的数据库服务器―而不是向外扩展-随着负 ...
- NoSQL数据库种类
NoSQL数据库的四大分类 键值(Key-Value)存储数据库 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.Key/value模型对于IT系统来说的优 ...
- 数据库 --> 8种NoSQL数据库对比
8 种 NoSQL 数据库对比 NoSQL是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储.现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改 ...
- NoSql 数据库理解
主要分类: 键值(Key-Value)存储数据库 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.Key/value模型对于IT系统来说的优势在于简单.易部署.但是 ...
随机推荐
- wcf系列5天速成——第二天 binding的使用(2)
承接上一章,今天来讲MSMQ在实战项目中的应用.众所周知,放了防止订单丢失,我们都是采用Order过一下MSMQ. MSMQ的优点个人认为是:先天的异步消息发送和天生的自动负载均衡. 好了,看看MSM ...
- 关于vs启动调试报错:CS0016: 未能写入输出文件“xxxxxxxx”--“目录名称无效。”解决方法
很多人都会遇到这个错误,网友说一般这错误都是由于权限引起,我尝试按照博客写的方法,解决失败!http://www.cnblogs.com/finesite/archive/2011/01/28/194 ...
- 【转】SQL Server查询字段说明
select c .name, isnull(ETP .value, '') as Des FROM syscolumns c inner join systypes t on c. xusertyp ...
- APP-SQLAP-10771
用户在匹配 PO时,其中一张AP INVOICE不管进行何种更新操作,总是报:APP-SQLAP-10771:Could not reserve record(不能保留记录) 错误. 而且这个发票问题 ...
- poj 3100
题意:给你两个数B.N,求一个数的N次方最接近B. 先求出B的1/N次方:A,然后比较A和A+1的N次方那个更接近B #include<stdio.h> #include <math ...
- Android listview 禁止滑动
listview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionE ...
- ExtJS4.2 Ext.grid.panel Store更改后刷新表格
//////////////////////// // Prepare store //////////////////////// // prepare fields and columns var ...
- css书写顺序和常用命名推荐
写代码的时候有一个好的规范和顺序能够帮你节省很多时间.下文将推荐相关CSS书写顺序和规范的一些方法.这个文档将会整理进前端规范文档中,如果你有更好的意见,不妨留言告知我们. CSS书写顺序 该代码来自 ...
- 走进C标准库(4)——"stdio.h"中的putc
花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功 能: 输出一字符到指定流中 用 法: int putc(int ch, FILE *stream); #define _putc_ ...
- MySql: Column 'XXXX' in field list is ambiguous 错误
[Err] 1052 - Column 'XXXX' in field list is ambiguous 例如: SELECT id, a.name, price, `describe`, scho ...