种种原因,我们每日一博的约定断了差不多一个月。原因有很多:开学啦,中秋啦,公司旅游啦,国庆啦........但今天我满血回归!坚持我们的每日一博!
按照约定,今天我们应该来聊聊 Binder、AIDL,但我博客的定位的基础中的基础,这两个属于稍微深点的东西,我们就不聊了。今天开始我们的第四点:Android的数据存储方式!
Android的数据存储方式,主要有五种:
一、Android本身的数据库:SQLite数据库,SQLite是一个轻量级的,跨平台的数据库。数据库中所有的信息都存储在单一文件内,占用内存小,并且支持基本SQL语法,是项目中经常被采用的一种数据存储方式,通常用于存储用户信息。
二、ShardPreferences,中文名应该可以翻译为:数据分区。这个本质是一个xml文件,以Map
三、文件存储,数据以 I/O 流的形式把数据存入手机内存或者手机SD卡,可以存储大数据,如音乐,图片,视频等。
四、ContentProvider,内容提供者。是Android的四大组件之一,以数据库的形式存入手机,可以共享自己的数据给其他应用使用,相对于其他对外共享数据方式而言,ContentProvider统一了数据访问方式,使用起来更规范。
五、网络存储,把数据存储到服务器,不存储在本地,使用的时候直接从网络获取,避免了手机端信息丢失以及其他安全隐患。
SQLite数据库的使用很简单,首先需要创建一个类,继承SQLiteOpenHelper 类,并实现其onCreate() 和onUpgrade() 方法 ,代码如下
public class DBHelper extends SQLiteOpenHelper {
private static final String DBName = "MyDb"; //声明一个数据库名
private static final int VERISON = 1; //声明一个数据库版本号
public DBHelper(Context context) {
super(context, DBName, null, VERISON);
}
/*
对数据库表进行初始化,只会在第一次创建数据库表时执行,并且只执行一次
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table demo(id int,name varchar(20))"; //书写创建表的SQL语句
db.execSQL(sql); //执行SQL语句,创建表
}
/*
这个方法是进行数据版本的更新
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
Android提供了一个名为 SQLiteDatabase
的类(SQLiteOpenHelper
类中的 getWritableDatabase()
和getReadableDatabase()
方法返回这个类的对象)。
SQLiteDatabase
类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。
SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;
rawQuery()方法用于执行select语句。
粗俗地讲就是可以通过这个类来进行增删改查!直接贴代码
public class DbManager {
private DBHelper dbHelper; //声明DBHelper类,需要通过这个类来获取SQLiterDatabase类的实例
private SQLiteDatabase db; //声明SQLiteDatabase类为全局变量,要只用这个类来进行增删改查
public DbManager(Context context){
dbHelper = new DBHelper(context); //初始化DBHelper类
db = dbHelper.getWritableDatabase(); //获取SQLiterDatabase类的实例
}
/*
使用SQL语句插入
*/
public void InsertDataforSQL(User user){
boolean flag = false;
//数据库操作有两种方式,一种是使用SQL语句,然后用execSQL(sql) 方法执行
//为防止sql注入,我们使用占位符
String insertSql = "insert into demo values(?,?)";
db.execSQL(insertSql,new Object[]{user.getId(),user.getName()});
//每次执行完记得关闭数据库
db.close();
}
/*
使用SQLiteDatabase 中的方法 insert() 执行插入数据
*/
public boolean InsertDataforcall(User user){
boolean flag = false;
ContentValues cv = new ContentValues();
cv.put("id",user.getId());
cv.put("name",user.getName());
long result = db.insert("demo",null,cv);
flag = result > 0 ? true : false;
return flag;
}
/*
删除数据
*/
public boolean DelectData(User user){
boolean flag = false;
//直接调用SQLiterDatabase 中的delter() 方法,
//参数1:要操作的表名
//参数2:过滤条件
//参数3:过滤的值
int result = db.delete("demo","id=?",new String[]{String.valueOf(user.getId())});
flag = result > 0 ? true : false;
return flag;
}
/*
更新数据
*/
public boolean UpdataData(User user){
boolean flag = false;
ContentValues cv = new ContentValues();
cv.put("name",user.getName());
//直接调用SQLiterDatabase update() 方法,
//参数1:要操作的表名
//参数2:更新的值,通过ContentValues 健值方式,将数据与数据库中字段绑定
//参数3:过滤条件
//参数4:过滤的值
int result = db.update("demo",cv,"id=?",new String[]{String.valueOf(user.getId())});
flag = result > 0 ? true : false;
return flag;
}
/*
查询返回一条数据
*/
public User SelectOneUser(int id){
User user = new User();
Cursor cs = db.rawQuery("select * from demo ",null);
while(cs.moveToNext()){
user.setId(cs.getInt(cs.getColumnIndex("id")));
user.setName(cs.getString(cs.getColumnIndex("name")));
}
return user;
}
/*
查询返回多条数据
*/
public List SelectListUser(){
List list = new ArrayList();
//直接调用SQLiterDatabase 中的rawQuery() 方法,
//参数1:数据库操作的sql 语句
//参数2:过滤的值,可以为空
Cursor cs = db.rawQuery("select * from demo",null);
while(cs.moveToNext()){
User user = new User();
user.setId(cs.getInt(cs.getColumnIndex("id")));
user.setName(cs.getString(cs.getColumnIndex("name")));
list.add(user);
}
cs.close();
return list;
}
//操作完数据库要将数据库关闭,防止内存泄漏
public void CloseDb(){
db.close();
}
使用Android studio 可以直接在
第二个包,con.example.lin.mycsdndome(androidTest) 中的类进行编写测试代码比如
点击方法名,右键运行,然后看到这个界面
就说明测试通过,然后到控制到查看你的信息就可以了,如果是红色,说明有bug,就要进行分析啦!
好了,为了使内容不要太多,今晚我们就到这,明天晚上我们再见!
(隔了一个月终于发布新博文了,好开心!)