笔记30 | 数据存储之SQLite的介绍及使用

前言

零零散散钻研了2天的SQLite的,终于有个基本的认识,说来没脸,正式工作20个月了,还真没用过的SQLite存储数据,因为我负责的公司项目都不需要联网,没有什么复杂的数据需存储,一般用SharedPreferences处理就行了!

前人栽树

http://www.jianshu.com/p/5c33be6ce89d http://blog.csdn.net/codeeer/article/details/30237597/

代码下载:http://download.csdn.net/download/xiangyong_1521/10109320

目录

  • SQLite的介绍

  • SQLiteDatabase的介绍

  • 一步一步实现



1.SQLite的介绍

SQLite是一款轻型的数据库,它的设计目标是嵌入式的,占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows / Linux / Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl,PHP,Java,C ++,.Net等,还有ODBC接口,同样比起Mysql,PostgreSQL这两款开源世界着名的数据库管理系统来讲,它的处理速度比他们都快。

特点

  • 轻量级:它是进程内的数据库引擎,因此不存在数据库的客户端和服务器

  • 单一文件:数据库中所有的信息(比如表,视图等)都包含在一个文件内这个文件可以自由复制到其它目录或其它机器上

  • 不需要安装

  • 跨平台/可移植

  • 开源

SQLite数据类型

一般数据采用的固定的数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL:这个值为空值

VARCHAR(n):长度

CHAR(n):长度固定为n的字串,n不能超过254. 

INTEGER:值被标识为整数,依据值的大小可以依次被字段,n不能超过存储为1,2,3,4,5,6,7,8。

REAL:所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号。

TEXT:值为文本字符串,使用数据库编码存储(TUTF-8,UTF-16BE或UTF-16-LE)。

BLOB:值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。

DATA:包含了年份,月份,日期。

TIME:包含了小时,分钟,秒。


2.SQLiteDatabase的介绍

常用方法:

方法 释义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建数据库
insert(String table,String nullColumnHack,ContentValues values)插入一条记录
delete(String table,String whereClause,String[] whereArgs)删除一条记录
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)查询一条记录
update(String table,ContentValues values,String whereClause,String[] whereArgs)修改记录
execSQL(String sql)执行一条SQL语句
close()关闭数据库

3.一步一步实现


3.1.创建一个继承在SQLiteOpenHelper的类

 
 
  1.    String sql = "create table if not exists " + TABLE_NAME + " (Version integer , Id integer primary key, CustomName text, OrderPrice integer, Country text)";

  2.    @Override

  3.    public void onCreate(SQLiteDatabase sqLiteDatabase) {

  4.         // 调用时间:数据库第一次创建时onCreate()方法会被调用

  5.        // onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据

  6.        // 这个方法中主要完成创建数据库后对数据库的操作

  7.        // create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);

  8.        sqLiteDatabase.execSQL(sql);

  9.    }

  10.    @Override

  11.    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

  12.        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;

  13.        // 调用时间:如果DB_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade

  14.        // onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号

  15.        // 这样就可以把一个数据库从旧的模型转变到新的模型

  16.        // 这个方法中主要完成更改数据库版本的操作

  17.        sqLiteDatabase.execSQL(sql);

  18.        onCreate(sqLiteDatabase);

  19.    }


3.2. 创建一个OrderDao用于处理所有的数据操作,在OrderDao中实例化OrderDBHelper

 
 
  1. public class OrderDao {

  2. public OrderDao(Context context) {

  3.    this.context = context;

  4.    ordersDBHelper = new OrderDBHelper(context, null, null, 0);

  5. }

  6. }

3.3.增/删/改/查

对于“增删改”这种对表内容变换的操作,我们需要先调用getWritableDatabase(),在执行的时候可以调用通用的execSQL(String sql)方法或对应的操作API:insert(),delete(),更新()。

而对“查”,需要调用getReadableDatabase(),这时就不能使用execSQL方法了,得使用查询()或rawQuery()方法

3.3.1增

a.首先填充一些数据

 
 
  1. /**

  2. * 初始化数据

  3. */

  4.        db = ordersDBHelper.getWritableDatabase();

  5.        db.beginTransaction();

  6.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 1, 'Arc', 100, 'China')");

  7.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 2, 'Bor', 200, 'USA')");

  8.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 3, 'Cut', 500, 'Japan')");

  9.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 4, 'Bor', 300, 'USA')");

  10.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 5, 'Arc', 600, 'China')");

  11.        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 6, 'Doom', 200, 'China')");

  12.        db.setTransactionSuccessful();

b.增加一条数据:

 
 
  1. /**

  2. * 新增一条数据

  3. */        

  4. db = ordersDBHelper.getWritableDatabase();

  5.        db.beginTransaction();

  6.        // insert into Orders(Id, CustomName, OrderPrice, Country) values (7, "Jne", 700, "China");

  7.        ContentValues contentValues = new ContentValues();

  8.        contentValues.put("Id", 7);

  9.        contentValues.put("CustomName", "Jne");

  10.        contentValues.put("OrderPrice", 700);

  11.        contentValues.put("Country", "China");

  12.        db.insertOrThrow(OrderDBHelper.TABLE_NAME, null, contentValues);

  13.        db.setTransactionSuccessful();

  14.        return true;

3.3.2 删

 
 
  1. db = ordersDBHelper.getWritableDatabase();

  2.        db.beginTransaction();

  3.        // delete from Orders where Id = 7

  4.        db.delete(OrderDBHelper.TABLE_NAME, "Id = ?", new String[]{String.valueOf(7)});

  5.        db.setTransactionSuccessful();

源码:

 
 
  1.    public int delete(String table, //表名

  2.          String whereClause,//删除条目判断

  3.          String[] whereArgs //删除位置

  4. ) {

  5.        acquireReference();

  6.        try {

  7.            SQLiteStatement statement =  new SQLiteStatement(this, "DELETE FROM " + table +

  8.                    (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);

  9.            try {

  10.                return statement.executeUpdateDelete();

  11.            } finally {

  12.                statement.close();

  13.            }

  14.        } finally {

  15.            releaseReference();

  16.        }

  17.    }

3.3.3 改

 
 
  1.        db = ordersDBHelper.getWritableDatabase();

  2.        db.beginTransaction();

  3.        // update Orders set OrderPrice = 800 where Id = 6

  4.        ContentValues cv = new ContentValues();

  5.        cv.put("OrderPrice", 800); //需要改的内容

  6.        db.update(OrderDBHelper.TABLE_NAME,

  7.                cv,

  8.                "Id = ?",

  9.                new String[]{String.valueOf(6)});//需要改的位置

  10.        db.setTransactionSuccessful();

3.3.4查

a.单数据查询:

 
 
  1.        db = ordersDBHelper.getReadableDatabase();

  2.        // select * from Orders where CustomName = 'Bor'

  3.        cursor = db.query(OrderDBHelper.TABLE_NAME,//table:表名称

  4.                ORDER_COLUMNS,//columns:列名称数组

  5.                "CustomName = ?", //selection:条件字句,相当于where

  6.                new String[] {name}, //selectionArgs:条件字句,参数数组

  7.                null, //orderBy:排序列

  8.                null, //having:分组条件

  9.                null);//orderBy:排序列

  10.        if (cursor.getCount() > 0) { //将cursor数据放到Order队列中

  11.            List<Order> orderList = new ArrayList<Order>(cursor.getCount());

  12.            while (cursor.moveToNext()) {

  13.                Order order = parseOrder(cursor);

  14.                orderList.add(order);

  15.            }

  16.            return orderList;

  17.        }      

b.总数查询:

 
 
  1.        db = ordersDBHelper.getReadableDatabase();

  2.        // select count(Id) from Orders where Country = 'China'

  3.        cursor = db.query(OrderDBHelper.TABLE_NAME,

  4.                new String[]{"COUNT(Id)"},

  5.                "Country = ?",

  6.                new String[] {"China"},

  7.                null, null, null);

  8.        if (cursor.moveToFirst()) {

  9.            count = cursor.getInt(0);

  10.        }

c.比较查询:

 
 
  1.        db = ordersDBHelper.getReadableDatabase();

  2.        // select Id, CustomName, Max(OrderPrice) as OrderPrice, Country from Orders

  3.        cursor = db.query(OrderDBHelper.TABLE_NAME,

  4.                new String[]{"Version",

  5.                "Id",

  6.                "CustomName",

  7.                "Max(OrderPrice) as OrderPrice", "Country"},

  8.                null, null, null, null, null);

  9.        if (cursor.getCount() > 0){

  10.            if (cursor.moveToFirst()) {

  11.                return parseOrder(cursor);

  12.            }

  13.        }


笔记29 | 整理Java的容器类

笔记28 | 学习一个简单好用的下拉刷新、上拉加载控件

笔记27 | WindowManager实现悬浮窗口总结

笔记26 | 总结Android的获取系统时间的几种方法

笔记25 | 通过自定义VIEW实现一个圆盘转动UI



结束



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值