标签:
还是从需求出发。在开发App的时候,经常需要缓存一些数据,不至于每次打开App都是空的,需要从网络下载数据。例如新闻客户端,需要缓存上次打开的新闻。
一般的做是使用SQLite数据库来保存数据,或者把数据序列化写到本地文件中。这两中方法,我在之前的项目中都用过。我先来说一下这两种方法的缺点:
说了上面那些方法的缺点,自然是为了请出本文的主角——SnappyDB。
SnappyDB是一个键-值数据库,是非常流行的NoSQL数据库。可以保存任何基本类型和序列化(Serializable)安全的数据及其数组。
首先来看一下基本用法,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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接口。这就意味着你以前的代码完全不要做任何改动。
1
2
3
|
Number[]
array = { new
AtomicInteger ( 42 ), new
BigDecimal( "10E8" ),
Double.valueOf(Math.PI)}; snappyDB.put( "array" ,
array); |
更多API文档,请看官方的Cookbook。
再来看看性能,如下图: 可以看到,性能上甩SQLite几条街。
当然,SnappyDB在数据的稳定性上,还是有待验证的,应该是不如成熟的SQLite。多线程访问安全问题,作者也没有提到。但是从我们的需求(用来缓存数据)来看,SnappyDB应该是非常好的选择。
这里我并没有横向比较Android上的其他NoSQL数据库。例如realm-java,是一个比较严谨NoSQL的实现,还有简单轻量级的实现,如Couchbase-Lite-Android和SimpleNoSQL。这些都没有用过,也不好做判断,以后如果用上了,再来补充。
标签:
原文地址:http://blog.csdn.net/dingjixian/article/details/42584295