Android数据存储之SQLite

        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  数据库对象
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.i("info", "创建数据库对象");
	}

	/**
	 * 当我们数据库有版本更新的时候回调的函数
	 * @param db 数据库对象
	 * @param oldVersion 数据库旧版本
	 * @param newVersion 数据库新版本
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.i("info", "数据库版本更新");
	}
	
	
	/**
	 * 此回调函数不是必须重写的
	 * 在数据库打开的时候回调
	 */
	@Override
	public 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"; //用户的ID
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值