Android的数据存储方式,主要有五种:
一、Android本身的数据库:SQLite数据库,SQLite是一个轻量级的,跨平台的数据库。数据库中所有的信息都存储在单一文件内,占用内存小,并且支持基本SQL语法,是项目中经常被采用的一种数据存储方式,通常用于存储用户信息。
二、ShardPreferences,中文名应该可以翻译为:数据分区。这个本质是一个xml文件,以Map<Object,Object>形式存入手机内存中,常用于存储比较简单的参数设置,如QQ登录账号密码的存储,窗口功能状态的存储等,使用起来比较简单方便。
三、文件存储,数据以 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) {
- }
然后我们创建一个数据库的操作类,其中要使用到SQLiteDatabase类,这个类有什么作用呢?
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<User> SelectListUser(){
- List<User> list = new ArrayList<User>();
- //直接调用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的模拟器运行实在是太慢了,所以这里我们要使用到Android的单元测试。
使用Android studio 可以直接在
第二个包,con.example.lin.mycsdndome(androidTest) 中的类进行编写测试代码
比如
点击方法名,右键运行,然后看到这个界面
就说明测试通过,然后到控制到查看你的信息就可以了,如果是红色,说明有bug,就要进行分析啦!