Android的数据存储方式,如数据库的基本操作和三级缓存实现--
------------------------------数据存储方式-----------------------------
1 使用SharedPreferences存储数据;
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user.getString(“PASSWORD”,””);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences user = getSharedPreferences(“user_info”,0);
user.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}
数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改 的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。
2 文件存储数据;
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
3 SQLite数据库存储数据;
4 使用ContentProvider存储数据;
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数 据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数 据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
5 网络存储数据;
需要与Android 网络数据包打交道
---------------------------------数据库的基本操作------------------------
一.Create
Create就是创建表,而要想创建表,首先必须要创建或者打开数据库。
有两种方式可以做到这点:
1.手动创建或者打开数据库
SQLiteDatabase database = openOrCreateDatabase("Student.db", MODE_PRIVATE, null);
调用openOrCreateDatabase()方法,如果有该数据库,就打开,没有就创建一个。该方法的具体信息还是得看源码,但一般我们使用的时候,只要指定数据库的名字和指定该数据库是私有的就行。
2.使用SQLiteOpenHelper
public class SQLHelper extends SQLiteOpenHelper {public SQLHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} }
然后我们再在Activity这样使用:
SQLHelper helper = new SQLHelper(this, "Student.db", null, 1);
版本号(不能为负数)是为了方便以后升级数据库,由于是初版,版本号就是1。
SQLiteOpenHelper是一个抽象的数据库操作类,首先执行的是OnCreate,这里我们可以执行创建表等动作,但该方法并没有真正创建数据库,创建数据库是在以下的情况:
SQLiteDatabase database = helper.getWritableDatabase();
调用getWritableDatabase()或者getReadableDatabase()时,就会真正创建数据库。
创建或打开数据库后,我们就可以建表。
使用数据库并不是一件难事,难就难在如何建模。这里我们就只建三个简单的表:
Teacher(teacherId, name, classId), Student(studentId,name,classId),Class(classId,className,studentId,teacherId),其中teacherId,studentId,classId分别是Teacher,Student和Class的主键。
SQLite可以直接执行SQL语句,所以,我们可以这样建表:
String CREATE_CLASS = "Create Table If Not Exists Class(classId integer primary key,"+ "className varchar(100),"+ "studentId integer References Student(studentId),"+ "teacherId integer References Teacher(teacherId))";SQLiteDatabase db = helper.getWritableDatabase();db.execSQL(CREATE_CLASS);
每次使用完数据库都要记得及时关闭数据库:
db.close();
二.Updata
更新这部分包括:插入,修改这两个动作。
先讲最基本的动作:插入。
我们现在要想将学生插入到班级中,像是这样:
ClassInfoProvider provider = new ClassInfoProvider(this);Student student = new Student(2857, "郑文彪");ClassInfo classInfo = new ClassInfo("电信1班", 1);provider.addStudent(student, classInfo);
这里我们有三个类:
public class ClassInfo {private String name;private int id;public ClassInfo() {}public ClassInfo(String name, int id) {this.id = id;this.name = name;}public int getId() {return this.id;}public void setId(int id) {this.id = id;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}}
public class Teacher {private int teacherId;private String name;private String className;public Teacher() {}public Teacher(int teacherId, String name) {this.name = name;this.teacherId = teacherId;}public int getTeacherId() {return this.teacherId;}public void setTeacherId(int teacherId) {this.teacherId = teacherId;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public String getClassName() {return this.className;}public void setClassName(String name) {this.className = name;} }
public class Student {private int studendtd;private String name;private String className;public Student() {}public Student(int studentId, String name) {this.name = name;this.studentId = studentId;}public int getStudentId() {return this.studentId;}public void setStudendId(int studentId) {this.studentId = studendtd;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public String getClassName() {return this.className;}public void setClassName(String name) {this.className = name;} }
这三个类就是存放Student,Teacher和Class的基本信息。
然后我们开始将学生插入到班级中:
public void addStudent(Student student, ClassInfo classInfo) {String INSERT_STUDENT_INTO_CLASS = "Insert Into Class(className, studentId, classId) Values('" + classInfo.getName() + "',"+ student.getStudentId() + "," + classInfo.getId() + ")";String INSERT_STUDENT = "Insert Into Student(studentId, name, classId) Values(" + student.getStudentId() + ","+ "'" + student.getName() + "'," + classInfo.getId() + ")";SQLiteDatabase db = helper.getWritableDatabase();db.execSQL(INSERT_STUDENT);db.execSQL(INSERT_STUDENT_INTO_CLASS);db.close();}
这是直接执行SQL语句的做法。
SQLiteOpenHelper封装了一个insert方法可以方便我们执行插入行为:
SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("className", classInfo.getName());values.put("studentId", student.getStudentId());values.put("classId", classInfo.getId());db.insert("Class", null, values);ContentValues values1 = new ContentValues();values1.put("studentId", student.getStudentId());values1.put("name", student.getName());values1.put("classId", classInfo.getId());db.insert("Student", null, values1);db.close();
ContentValues其实就是一个字典Map,key值就是表中的列值,而value就是对应的字段。insert方法的第一个参数是要插入的表名,第二个参数就是相应的列,这里我们用null表示所有的列,然后就是我们要插入的字段。
这样的方法确实可以简化我们的操作,至少不用在我们的代码中写那么长的SQL语句,容易犯错,又很烦,尤其是在插入的动作不断执行的时候。但有个地方值得注意:如果我们的数据库是提供接口方法给其他模块使用,而且以后要修改的人或者查看的人并不是我们自己,他们可能就必须知道这些方法的参数是什么,但直接执行SQL语句,只要他有数据库的基础知识,就会明白这是在干嘛,也知道如何修改。更糟糕的情况就是以后android的接口方法发生变化的话,那么,这些代码可能就会出现问题。当然,我们愿意相信他们不会修改接口,因为对接口的修改是一种错误的行为,尤其在接口已经发布的情况下。
现在我们的表已经有数据了,如果我们想要修改的话,像是将学生的姓名进行更改,可以这样操作:
public void updateStudent(int id, String name) {SQLiteDatabase db = helper.getWritableDatabase();String UPDATE_STUDENT = "Update Student Set name =" + "'" + name + "' Where id=" + id + "";db.execSQL(UPDATE_STUDENT);db.close();}
当然,我们同样可以简化:
public void updateStudent(int id, String name) {SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues(); values.put("name", name); db.update("Student", values, "studentId=?", new String[]{id + ""}); db.close();}
update方法中,值得注意的是最后面两个参数,whereClause和whereArgs。whereClause表示要修改哪里,whereArgs表示修改的字段,无论我们是要修改一个字段还是一个以上,这里都需要一个String[]。
三.Read
所谓的Read,就是一系列查询动作。
我们要在Student这个表中查询名为"郑文彪"的学号,就是studentId:
public int getStudentId(String name) {int id = 0;String SELECT_STUDENTID = "Select studentId From Student Where name=?";SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.rawQuery(SELECT_STUDENTID, new String[]{name});if (cursor.moveToNext()) {id = cursor.getInt(0);}cursor.close(); db.close(); return id;}
这里我们需要利用光标Cursor。Cursor指向当前的数据记录,然后我们可以从光标中获取相应的数据。
四.Delete
Delete包括表的删除,数据记录的删除。
首先是数据记录的删除。现在我们想要删除姓名为"郑文彪"的学生的记录:
public void deleteStudent(Student student) {SQLiteDatabase db = helper.getWritableDatabase();String DELETE_STUDENT = "Delete From Class Where studentId=?";db.execSQL(DELETE_STUDENT, new String[]{student.getStudentId() + ""});db.close();}
然后这样调用该方法:
Student student = new Student(2857, "郑文彪");ClassInfo classInfo = new ClassInfo("电信1班", 1);provider.addStudent(student, classInfo);provider.deleteStudent(student1);
同样可以简化:
db.delete("Class", "studentId=?", new String[]{student.getStudentId() + ""});
接着是删除表,这个很简单:
String DROP_CLASS = "Drop Table Class"; SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL(DROP_CLASS);
在做测试的时候,由于需要经常运行,所以数据库中表的数据会非常冗余,尤其是将键值设为自增的时候。所以,我们需要在每次测试后删除表,这样下次测试的时候就不会受到影响。
-------------------------------------三级缓存---------------------------------------
关于缓存层的工作,当我们第一次打开应用获取图片时,先到网络去下载图片,然后依次存入内存缓存,磁盘缓存,当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络上去下载,直接可以从内存缓存和磁盘缓存中找,由于内存缓存速度较快,我们优先到内存缓存中寻找该图片,如果找到则运用,如果没有找到(内存缓存大小有限),那么我们再到磁盘缓存中去找。只要我们合理的去协调这三层缓存运用,便可以提升应用性能和用户体验。
1、内存层:(手机内存)
内存缓存相对于磁盘缓存而言,速度要来的快很多,但缺点容量较小且会被系统回收,这里的实现我用到了LruCache。
LruCache这个类是Android3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。
磁盘层:(SD卡)
相比内存缓存而言速度要来得慢很多,但容量很大,这里的实现我用到了DiskLruCache类。
DiskLruCache是非Google官方编写,但获得官方认证的硬盘缓存类,该类没有限定在Android内,所以理论上java应用也可以使用DiskLreCache来缓存。
这是DiskLruCache类的下载地址:http://pan.baidu.com/s/1hq0D53m
网络层:(移动网络,无线网络)
这个就没什么解释的了,就是我们上网用的流量。这里的网络访问实现我用到了开源框架Volley。
开源框架Volley是2013年Google I/O大会发布的,Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
这是Volley的下载地址:http://pan.baidu.com/s/1hq1t2yo
转载于:https://www.cnblogs.com/aWay01/p/5249163.html
Android的数据存储方式,如数据库的基本操作和三级缓存实现--相关推荐
- android常用的存储方式,Android 常见数据存储方式
Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串.布尔值.基础数据.集合等数据.常用于存储较简单的参数设置. 2 ...
- android的数据存储方式有哪几种方式,android存储数据的几种方式比较
机身内存读取主要用个两个类文件输入流(FileInputStream)和文件输出流(FileOutputStream):FileInputStream fileInput = this.openFil ...
- android的数据存储方式有哪几种方式,Android存储数据的5种方式
第一种:SharedPreferences 1.使用键值对的方式存储数据 2.通常用于:保存用户的偏好设置.选择是否保存密码.记录文档阅读的位置等 3.实现方式(写入): a).获取SharedPre ...
- Android的数据存储方式
1.Shared Preferences 2.文件存储数据 3.数据库 4.Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数 ...
- android画面数据存储方式,Android的三种储存方式
SharePreferences SharePreferences适合用来保存相对较小的键值集合,比如应用程序的配置文件,它本质是存放在/data/data/[包名]/shared_prefs文件夹下 ...
- Android中的5种数据存储方式
Android中的5种数据存储方式 Android中的5种数据存储方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPref ...
- android 存储方式简书,Android的多种数据存储方式
1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...
- 深入剖析Android中最简单的数据存储方式:SharedPreferences
目录 一. 使用SharedPreferences存储数据 二. 数据的存储位置和格式 三.存储数据的获取 四. 存取复杂类型的数据 五. 设置数据文件的访问权限 Hello,你好呀,我是灰小猿,一个 ...
- Android 数据存储之SQLite数据库
转载请标明出处: http://blog.csdn.net/airsaid/article/details/52419418 本文出自:周游的博客 前言 SQLiteDatabase 创建数据库和表 ...
最新文章
- FreeRTOS 临界段和开关中断
- usbserials
- SpringCloud:Zuul 路由访问(基本使用、路由功能、过滤访问、服务降级)
- [C++] socket - 3 [线程简单例子 代码]
- 欢迎使用CSDN-markdown编辑器132133
- 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 1
- apache和mysql 403_如何使用mysql(lamp)分离环境搭建dedecms织梦网站及apache服务器常见的403http状态码及其解决方法...
- 难道现在是保险业的高速发展期?
- source ./ 和 . 的区别
- android x5 webview 第一次,android studio中配置X5 webview时的一个坑
- 理正深基坑弹性计算方法_理正深基坑整体计算与单元计算的区别
- react里面 内联css样式怎么样_简单的使用Radium管理React中的内联样式
- Python +大数据-知行教育(四)-意向用户主题看板_全量流程
- window系统cmd的常用几条指令
- pytorch自动下载的权重保存位置
- MATLAB绘制长方体
- [多校联考-初级]徒步旅行
- 兰亭集势 php面试题,兰亭集势笔试题
- Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)
- 英伟达硬件解码器分析