Android数据存储之SQLite

来源:互联网 发布:二维淘宝排名 编辑:程序博客网 时间:2024/05/29 09:29

        sqlite在android里面的应用十分广泛,例如我们的离线缓存、APP运行数据存储、数据处理等等。我们的QQ的聊天记录也是通过sqlite数据库存储的。所以这几天天天倒腾android里面的数据存储方式了。看了看视频,又翻了翻博客,又咨询了咨询,终于把SQLite稍微透彻点了。好了,废话不多说,不如正规。

        什么是sqlite

        优点: sqlite是一种轻量的、高效的、零配置、嵌入式的、ACID事务性的关系型数据库。我们可以将其看作是一个API库、数据引擎库。因为谷歌已经把他放在了Android里面了。我们可以直接使用,不需要安装。
       缺点:并发性能稍微困难,就是说我们多个进行同时对sqlite进行操作。网络文件支持的也比较弱。它虽然支持了sql大部分功能子集,但不是全部。

        sqlite数据类型

         NULL :空值。    
         INTEGER:带符号的整数。
         REAL:浮点数字,存储为8-byte IEEE浮点数 。            
         TEXT:字符串文本     
         BLOB:二进制对象

         sqlite数据库的操作自己手动操作和使用API库函数操作


 下面先看一下手动操作吧:

          数据库的创建

     我们新建一个项目,命名为SqliteDemo。看一下目录结构。每一个java类在下面都有详细的解释

准备工作
      由于在下面会经常用到数据库的名字、表的名字、数据库的版本号等等一些信息。我们把这些常量放在一个公共类中。
package com.fdd.sqlitedemo;//公共类public class Constant {public static final String DATABASE_NAME="info.db";//数据库名称public static final int DATABASE_VERSION=1;//数据库版本public static final String TABLE_NAME="";//表名}
        这些公共的参数放在里面。以后还有其他的一些公公参数也放在里面。我们在布局文件里面添加一个按钮。当点击按钮的时候创建数据库。接下来为了实现代码分离。我们将创建数据库的操作单独封装了一个MysqliteHelper类并继承SQLiteOpenHelper接口,重写里面的构造方法即可

接下来看一下我们MysqliteHelper到底怎么实现的。
/** * SQLiteOpenHelper * 1、提供了onCreate,onUpgrade等创建数据库更新数据库方法 * 2、提供了获取数据库对象的函数。 */public class MysqliteHelper extends SQLiteOpenHelper {/** * 构造函数 * @param context   上下文对象 * @param name      表示创建的数据库的名称 * @param factory    游标工厂 * @param version   表示创建的数据库的版本》=1 */@SuppressLint("NewApi") public MysqliteHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);}/** *  * @param context */public MysqliteHelper(Context context){super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);}/** * 当数据库创建的时候回调的函数 * @param db  数据库对象 */@Overridepublic void onCreate(SQLiteDatabase db) {Log.i("info", "创建数据库对象");}/** * 当我们数据库有版本更新的时候回调的函数 * @param db 数据库对象 * @param oldVersion 数据库旧版本 * @param newVersion 数据库新版本 */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.i("info", "数据库版本更新");}/** * 此回调函数不是必须重写的 * 在数据库打开的时候回调 */@Overridepublic void onOpen(SQLiteDatabase db) {Log.i("info", "打开了数据库");super.onOpen(db);}}
      我们在创建数据库的时候为了显示创建成功,我们log一下在后台。既然我们有了创建数据库的类,我们点击Button创建就好了。我们以前可能接触过MVC模式。就是把模型层、控制层、表现层给分离开。在这里由于我们经常要操作数据库。如果我们全部把代码都放在Activity里面,那里面的代码就太多了。而且杂乱无章,为此我们创建一个对数据库操作的工具类DbManger.java
/** * 对数据库操作的工具类 */public class DbManger {private static MysqliteHelper helper;public static MysqliteHelper getInstance(Context context){if(helper==null){helper=new MysqliteHelper(context);}return helper;}//执行SQL语句public static void execSQL(SQLiteDatabase db,String sql){if(db!=null){//如果数据库不为空if(sql!=null&&!"".equals(sql)){//如果sql语句不为空db.execSQL(sql);//执行sql语句}}}}
最后一步:点击按钮创建数据库
     我们在我们的Activity里面的oncreate()方法里面通过刚刚定义好的DbManger得到操作数据库的对象。
//拿到数据库操作对象        helper=DbManger.getInstance(MainActivity.this);
     接下来我们为按钮创建一个方法,在这个方法里面通过上面得到的helper对象创建数据库
SQLiteDatabase db=helper.getWritableDatabase();
也是一句话。我们也可以使用helper.getReadableDatabase();创建数据库,两者有什么区别呢?
     两者都表示:创建打开数据库。如果不存在则创建。当磁盘已满,或者是数据库本身权限的情况下getReadableDatabase打开的是只读数据库
   下面我们运行一下看一下后台的输出结果,看看一下会不会创建。

   创建表:

    在上面我们已经创建了数据库,接下来就是创建表了,创建了表我们才能对其进行增删改查的操作。 我们在什么时候创建表呢?其实我们在创建数据库的时候顺带着创建一张表就好。在我们MysqliteHelper里面的onCreate里面添加创建表的代码就好了。
String sql="create table person(_id Integer primary key,name varchar(10),age Integer)";db.execSQL(sql);
好了我们再次运行就能创建一张表了。但是呢由于我们也会经常用到_id、name、age这些属性,不如还把他放在Constant公共参数类里面吧。添加以下代码在Constant类中。以后再用到这些常亮的时候直接使用即可,上面的能看明白就好,就不改了。
public static final String _ID="_id"; //用户的IDpublic static final String NAME="name"; //用户的姓名public static final String AGE="age"; //用户的年龄
        下面再次运行就能创建一张表了。打开我们dervice在里面的data里面找到我们的包名下面就有我们创建的表了。
     

    对表的操作:增

       在我们Activity里面写一个方法,在这个方法里面包含了对表的增删改查操作
  public void doClick(View view){    switch (view.getId()) {    //增加数据.插入两条数据case R.id.add_data:SQLiteDatabase db=helper.getWritableDatabase();String sql="insert into person value (1,'zhangsan',20)";DbManger.execSQL(db, sql);String sq2="insert into person value (2,'lisi',25)";DbManger.execSQL(db, sq2);//调用上面写好的方法db.close();//防止占用资源break;}    }

    对表的操作:改

case R.id.update_data:db=helper.getWritableDatabase();String sql3="update person set name='fdd' where _id=1";DbManger.execSQL(db, sql3);db.close();//防止占用资源break;
   删除操作类似,只是把上面的sql语句给改一下就好了。写到这里,我们发现我们都是自己写这些SQL语句,有时候我们自己记不住这些语句怎么办呢?这时候我们可以使用谷歌提供的库函数来增删改查操作。
       
     使用API库函数进行增删改查
              在布局文件里面添加几个按钮,用来对表的增删改查操作

      对表的操作:增

//使用API函数进行增加case R.id.insert_api:db=helper.getWritableDatabase();ContentValues values=new ContentValues();values.put("_id", 3);//第一个参数表示插入的字段名,第二个表示值values.put("name", "xiaoming");values.put("age", 10);db.insert("person", null, values);db.close();//防止占用资源break;

      对表的修改

case R.id.update_api:db=helper.getWritableDatabase();ContentValues values1=new ContentValues();values1.put("_id", 3);//第一个参数表示修改的字段名,第二个修改后的值int dd=db.update("person", values1, "_id=3", null);//dd表示修改的SQL语句的条数if(dd>0){Log.i("info", "修好数据成功");}else{Log.i("info", "修好数据失败");}db.close();//防止占用资源break;

      对表的删除

case R.id.delete_api:db=helper.getWritableDatabase();int ss=db.delete("person", "_id=1", null);if(ss>0){Log.i("info", "删除数据成功");}else{Log.i("info", "删除数据失败");}db.close();//防止占用资源break;

    下载源代码

1 0