Android的数据存储的几种方式
SharePreferences:轻量级的数据存储,以键值对的形式存储数据,数据存储的格式为xml
SQLite:Sql数据库
Content Provider:Android提供的数据共享的一种功能,可以获取其他App的数据
File文件存储:I/O文件存储;
网络存储:
上面五种方式都能够存储数据,使用情境不同,本篇介绍的是SQLite,然后再介绍一款开源数据库Realm的使用:
SQLite
SQLite使用的是标准的Sql语句,增、删、改、查等操作与其他数据库无异,只要熟悉sql语句,再了解一下格式SQLite操作就能正确使用SQLite;
SQLite使用请参考Android开发的文档;文档中有很好的例子,下面解释部分;
public class FeedReaderDbHelper extends SQLiteOpenHelper { // If you change the database schema, you must increment the database version. public static final int DATABASE_VERSION = 1; public staticfinal String DATABASE_NAME = "FeedReader.db"; public FeedReaderDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { //新建表操作 db.execSQL(SQL_CREATE_ENTRIES); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 表的更新操作 db.execSQL(SQL_DELETE_ENTRIES); onCreate(db); } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { onUpgrade(db, oldVersion, newVersion); } }
存入数据库
SQLiteDatabase db = mDbHelper.getWritableDatabase; // 通过一个新建的ContentValues以键值对的方式传值 ContentValues values = new ContentValues; values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id); values.put(FeedEntry.COLUMN_NAME_TITLE, title); values.put(FeedEntry.COLUMN_NAME_CONTENT, content); // 插入新的一个行,返回该item的主键 long newRowId; newRowId = db.insert( FeedEntry.TABLE_NAME, FeedEntry.COLUMN_NAME_NULLABLE, values);
读取数据库
SQLiteDatabase db = mDbHelper.getReadableDatabase; // 定义一个 projection ,projection是你想获取数据库的列数据 String projection = { FeedEntry._ID, FeedEntry.COLUMN_NAME_TITLE, FeedEntry.COLUMN_NAME_UPDATED, ... }; // 数据以某种方式排序CursorString sortOrder = FeedEntry.COLUMN_NAME_UPDATED + " DESC"; Cursor c = db.query( FeedEntry.TABLE_NAME, // 查询的表名 projection, // 返回的列数据 selection, // 查询列要求 selectionArgs, // 查询值的要求 null, // 分组语句 null, // 分组过滤操作 sortOrder // 排序规则 );
通过Cursor的值获取方式读取数据
cursor.moveToFirst; long itemId = cursor.getLong(cursor.getColumnIndexOrThrow(FeedEntry._ID));
Sqlite需要注意的
一个Application维护一个数据库文件(.db文件),每个数据库文件中可以有多张表;
在数据库增删改查操作用到的FeedReaderDbHelper(extends SQLiteOpenHelper)实例mDbHelper需要在Application中的OnCreat中创建,而且全局只需要一个实例;(和前面介绍的picasso实例构造相同)
数据库操作属于耗时操作,不能在主线程调用;
Realm && RxJava
虽然Google官方使用Sqlite来作为Android的数据库,但是看到上面的简介和代码后感觉还是觉得庞然大物,如果编程基础比较少的童鞋一定不会感觉到容易,所以现在就来说一说另外一种开源数据库Realm:官方文档
官方文档介绍的Realm的用法非常详细,并且相对于SQLite来说创建数据表是非常简单的,所以本篇的重点不在这里。本篇主要讲一讲Realm如何配合Retrofit+RxJava使用:
先对照看看Realm给出的例子:从Person数据表中读取出"githubUserName",然后使用retrofit做网络请求,得到GithubUser,将GithubUser的数据传入到UserViewModel中,最后通过UI显示出来;(这里只是截取RxJava的操作部分)
看代码:
subion = realm.where(Person.class).isNotNull("githubUserName").findAllSortedAsync("name").asObservable .filter(new Func1<RealmResults<Person>, Boolean> { @Override public Boolean call(RealmResults<Person> persons) { // 过滤没有被出的数据行 return persons.isLoaded; } }) .flatMap(new Func1<RealmResults<Person>, Observable<Person>> { @Override public Observable<Person> call(RealmResults<Person> persons) { // 一个一个将RealmResults<Person> 传入Observable return Observable.from(persons); } }) .flatMap(new Func1<Person, Observable<GitHubUser>> { @Override public Observable<GitHubUser> call(Person person) { // 使用Retrofit进行网络请求,得到GitHubUser类型的数据 return api.user(person.getGithubUserName); } }) .map(new Func1<GitHubUser, UserViewModel> { @Override public UserViewModel call(GitHubUser gitHubUser) { //使用Map将GitHubUser数据转换成UserViewModel类型 return new UserViewModel(gitHubUser.name, gitHubUser.public_repos, gitHubUser.public_gists); } }) .observeOn(AndroidSchedulers.mainThread) // Retrofit put us on a worker thread. Move back to UI .subscribe(new Action1<UserViewModel> { @Override public void call(UserViewModel user) { // 打印UI的数据 TextView userView = new TextView(RetrofitExample.this); userView.setText(String.format(Locale.US, "%s : %d/%d",user.getUsername, user.getPublicRepos, user.getPublicGists)); container.addView(userView); } }, newAction1<Throwable> { @Override public void call(Throwable throwable) { throwable.printStackTrace; } });
好吧,我承认RxJava让上面代码的可读性变差了,但是这里的RxJava链式操作写的非常漂亮,对filter、flatmap、map等几个操作符的使用的也非常到位(膜拜ing!!!),如果你了解这些操作符,那么你就会喜欢上RxJava这种编程方式。
Android数据库是比较轻量级的,数据存储量不宜过大、创建的数据表不宜太复杂。我们常用的操作在官网上全部可以找得到,这里算是给大家一个引子。当然Square公司的sqlbrite也是一个不错的选择;
至于上面说的两个数据库,大家可以自行选择使用:
SQLite是官方推荐的数据库,而且里面很多“坑”也已经被开发者们踩过了,开发过程中遇到的任何问题应该都可以找到解决方法;但是SQLite的使用的方法非常麻烦!
虽然目前Realm还是beta版本,但是使用简单,功能也越发强大,并且基本上完全满足我们需求,同时它还能够结合很多流行的开源库来使用,写起来还是很“酷”的;
如果上面有不正确的地方,请大家指正!
关注达牛,更多android,ios技巧等你来索取。
标签: 数据库安卓版