Android的数据存储方式

        种种原因,我们每日一博的约定断了差不多一个月。原因有很多:开学啦,中秋啦,公司旅游啦,国庆啦........但今天我满血回归!坚持我们的每日一博!

    按照约定,今天我们应该来聊聊 Binder、AIDL,但我博客的定位的基础中的基础,这两个属于稍微深点的东西,我们就不聊了。今天开始我们的第四点:Android的数据存储方式!

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,就要进行分析啦!


好了,为了使内容不要太多,今晚我们就到这,明天晚上我们再见!

(隔了一个月终于发布新博文了,好开心!)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值