Android SQLiteDatabase 缓存带给用户更好的体验...

 ***************************************************************************************************************************************************************************************

     也许你的主页面的列表信息是登录之后,通过网络加载的,那这样设置会导致用户每次进入主页面有加载的延迟,你可能会说,可以设置进度框,那网络情况不好的时候, 不是会一直在界面打转,"请稍候.."的字样长时间显示,这就会给用户造成不好的体验,那怎么样可以既要实现存储功能,又要不影响用户体验?也许你的应用中使用了同步手机通讯录的功能,那用户在同步并修改联系人之后,退出登录,过段时间,重新登录,想找之前修改的联系人打电话唠会,发现又需要重新同步,并且同步后的联系人也不是之前修改的?。。。诸如此类问题,开发中会遇到很多,那该怎么解决这个问题呢?这样我们就不可避免要用到缓存功能,好,接下来选择存储方式:使用sharePreference,存储数据有点小,不合适,ContentProvider,手机存储比较合适,。。。这时候是不是会想到数据库,Android自带的数据库SQLiteDatabase,感觉差不多,下面我们来试试,看能否满足我们的需求:存储主页面数据信息,以备下次登录避免重新网络请求 

    首先来说一下SQLiteDatabase 是什么?

    SQLiteDatabase 是小型的嵌入式数据库,以文件进行存储。

   在Andrdoid系统中已经集成了该数据库,故在进行Andrdoid程序开发的时候可以很方便的获取该数据库,从而进行增、删、改、查的操作。

    1. SQL语句

       a.建表语句:create table table_name(column_name1, column_type1,column_name2,column_type2,)

       b.插入语句:insert into table_name(column_name1,column_name2,......)values (column_data1,column_data2,......)

       c.更新语句:update table_name set column_name= column_newData where column_name = column_data ;

       d. 删除语句:delete from table_name where column_name = column_data ;

       e.查询语句:select column_name1,column_name2,...from table_name where column_name = column_data ;

       查询所有数据:select * from table_name ;

      f.删除表语句:drop table table_name ;

    2.数据类型

       text  文本型

       integer  整数型

       null   空数据

       double/float/real  小数型

    3. 使用方法

       SQLiteDatabase 对象的创建需要借助辅助类SQLiteOpenHelper

     a.创建SQLiteOpenHelper的子类,添加构造方法,用于指明创建出来的数据库的相关信息

          参数一:上下文

          参数二:指定获取数据库的名字

          参数三:指定创建游标的工厂对象

          参数四:指定数据库的版本号

     b.重写onCreate()和onUpgrade()方法

          当数据库对象被系统创建的时候,系统会调用onCreate()方法,做一些初始化工作,该方法只会在数据库第一次被创建的时                 候才会被系统调用

     c. 创建SQLiteOpenHelper类的对象,传入数据库的信息

     d.借助于辅助类获取数据库对象

      getReadableDatabase()与getWritableDatabase()这两个方法获取的都是可读可写的数据库,仅在手机存储空间不足,Readable方法返回的才是一个只可读的数据库

     e.调用数据库对象的增、删、改、查方法,进行数据的操作

    4.事务回滚

     a. 获取helper对象

     b. 获取数据库对象

     c.开启事务

     d.将事务添加到try...catch...中

     e.标记事务执行成功(如果不调用该方法,事务是不会提交的)

       setTranctionSuccessful()

     f. 在finally中关闭事务

       endTransaction()

     g. 在onDestroy()中关闭数据库

      

database.insert(String table, String nullColumnHack, ContentValues values);  
database.update(String table, Contentvalues values, String whereClause, String whereArgs); 

       第一个参数表示插入数据的数据表的名称,第二个参数表示当values参数为空或者里面没有内容的时候,insert会失败(底层数据

库不允许插入一个空行),为了防止这种情况,要在这里指定一个列名,到时候如果发现将要插入的行为空时,就会将你指定的这个

列明的值设为null,然后在向数据库中插入
   

    第三个参数是ContentValues类型的变量,由K-V形式组成,和Map使用方法类似 ,Key代表要插入的列名,Value代表要插入的值,update方法中的第二个参数,用法与此相同。

    update方法中的第三个参数表示查询条件,比如"where _id=?"、" and _id =? or name =? ",而whereArgs 则表示占位符的实际 

的参数值,通常用String数组形式体现:new String []{ "%"+ name +"%",_id}
    

    查询的话,虽然说查询的方式比较多,但在我看来都是由最简单的衍生出来的,类似于代码解耦性,那其他查询的方法可以自己

查看Android官方文档,下面介绍一种比较简单的:
 

      database.rawQuery(String sql, String[] selectionArgs);

    

将你所需要的查询语句,全部拼到sql中,然后里面用到的参数值,用selectionArgs占位符代替,就可以了,
    
   相对于其他方法来说,不用将各个参数分隔开,使用一条sql语句就可以搞定,缺点就是阅读起来可能不太方便,这个根据习惯自己
决定了。
    第三个参数是ContentValues类型的变量,由K-V形式组成,和Map使用方法类似 ,Key代表要插入的列名,Value代表要插入的值,update方法中的第二个参数,用法与此相同。
    update方法中的第三个参数表示查询条件,比如"where _id=?"、" and _id =? or name =? ",而whereArgs 则表示占位符的实际的参数值,通常用String数组形式体现:new String []{ "%"+ name +"%",_id}
    查询的话,虽然说查询的方式比较多,但在我看来都是由最
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值