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

前言

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

前人栽树

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

目录

  • 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的类

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
         // 调用时间:数据库第一次创建时onCreate()方法会被调用

        // onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据
        // 这个方法中主要完成创建数据库后对数据库的操作

        // create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        // 调用时间:如果DB_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade

        // onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号
        // 这样就可以把一个数据库从旧的模型转变到新的模型
        // 这个方法中主要完成更改数据库版本的操作

        sqLiteDatabase.execSQL(sql);
        onCreate(sqLiteDatabase);
    }

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

public class OrderDao { 
 public OrderDao(Context context) {
    this.context = context;
    ordersDBHelper = new OrderDBHelper(context, null, null, 0);
}
}

3.3.增/删/改/查

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

3.3.1增

a.首先填充一些数据

/**
 * 初始化数据
 */
        db = ordersDBHelper.getWritableDatabase();
        db.beginTransaction();

        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 1, 'Arc', 100, 'China')");
        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 2, 'Bor', 200, 'USA')");
        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 3, 'Cut', 500, 'Japan')");
        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 4, 'Bor', 300, 'USA')");
        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 5, 'Arc', 600, 'China')");
        db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 6, 'Doom', 200, 'China')");

        db.setTransactionSuccessful();

b.增加一条数据:

/**
 * 新增一条数据
 */        
db = ordersDBHelper.getWritableDatabase();
        db.beginTransaction();

        // insert into Orders(Id, CustomName, OrderPrice, Country) values (7, "Jne", 700, "China");
        ContentValues contentValues = new ContentValues();
        contentValues.put("Id", 7);
        contentValues.put("CustomName", "Jne");
        contentValues.put("OrderPrice", 700);
        contentValues.put("Country", "China");
        db.insertOrThrow(OrderDBHelper.TABLE_NAME, null, contentValues);

        db.setTransactionSuccessful();
        return true;

3.3.2 删

db = ordersDBHelper.getWritableDatabase();
        db.beginTransaction();

        // delete from Orders where Id = 7
        db.delete(OrderDBHelper.TABLE_NAME, "Id = ?", new String[]{String.valueOf(7)});
        db.setTransactionSuccessful();

源码:

public int delete(String table, //表名
          String whereClause,//删除条目判断
          String[] whereArgs //删除位置
) {
        acquireReference();
        try {
            SQLiteStatement statement =  new SQLiteStatement(this, "DELETE FROM " + table +
                    (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
            try {
                return statement.executeUpdateDelete();
            } finally {
                statement.close();
            }
        } finally {
            releaseReference();
        }
    }

3.3.3 改

db = ordersDBHelper.getWritableDatabase();
        db.beginTransaction();

        // update Orders set OrderPrice = 800 where Id = 6
        ContentValues cv = new ContentValues();
        cv.put("OrderPrice", 800); //需要改的内容
        db.update(OrderDBHelper.TABLE_NAME, 
                cv,
                "Id = ?",
                new String[]{String.valueOf(6)});//需要改的位置
        db.setTransactionSuccessful();

3.3.4查

a.单数据查询:

db = ordersDBHelper.getReadableDatabase();
        // select * from Orders where CustomName = 'Bor'
        cursor = db.query(OrderDBHelper.TABLE_NAME,//table:表名称
                ORDER_COLUMNS,//columns:列名称数组
                "CustomName = ?", //selection:条件字句,相当于where
                new String[] {name}, //selectionArgs:条件字句,参数数组
                null, //orderBy:排序列
                null, //having:分组条件
                null);//orderBy:排序列

        if (cursor.getCount() > 0) { //将cursor数据放到Order队列中
            List<Order> orderList = new ArrayList<Order>(cursor.getCount());
            while (cursor.moveToNext()) {
                Order order = parseOrder(cursor);
                orderList.add(order);
            }
            return orderList; 
        }

b.总数查询:

db = ordersDBHelper.getReadableDatabase();
        // select count(Id) from Orders where Country = 'China'
        cursor = db.query(OrderDBHelper.TABLE_NAME,
                new String[]{"COUNT(Id)"},
                "Country = ?",
                new String[] {"China"},
                null, null, null);

        if (cursor.moveToFirst()) {
            count = cursor.getInt(0);
        }

c.比较查询:

db = ordersDBHelper.getReadableDatabase();
        // select Id, CustomName, Max(OrderPrice) as OrderPrice, Country from Orders
        cursor = db.query(OrderDBHelper.TABLE_NAME, 
                new String[]{"Version",
                "Id", 
                "CustomName",
                "Max(OrderPrice) as OrderPrice", "Country"},
                null, null, null, null, null);

        if (cursor.getCount() > 0){
            if (cursor.moveToFirst()) {
                return parseOrder(cursor);
            }
        }

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-11-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏雪胖纸的玩蛇日常

django orm 重点大全

2374
来自专栏不想当开发的产品不是好测试

mybatis 使用tips - 使用多个参数

执行如下命令: mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate 可以使用my...

1869
来自专栏Jerry的SAP技术分享

如何使用ABAP代码反序列化JSON字符串成ABAP结构

我的任务是解析出上图黑色方框里的几个字段,比如ObjectID, ETag, BuyerID, DateTime, ID, Name等等,把它们的值存储到对应A...

772
来自专栏杨建荣的学习笔记

pl/sql中的参数模式(r4笔记第54天)

在平时的工作中,可能通过pl/sql传入参数来做一些特定的操作,参数模式一般有In,out.in out这几种 比如dbms_sqltune下的PREPARE_...

3104
来自专栏LeoXu的博客

[翻译]Android教程-保存数据-在SQL数据库中保存数据

SQL数据库的主要原则是模式(schema): 一种数据库被如何组织的正式声明. 模式被反映在你用来创建你的数据库的SQL语句中. 你可能会发现创建一个同伴类...

763
来自专栏分布式系统进阶

FBString分析与使用FBString简介

简单来说,使用了三层存储策略+内存分配策略+大小端支持,特别是配合使用 jemalloc, 减少磁盘碎片,加快并发下的分配速度和性能。

1652
来自专栏lgp20151222

ResultSet相关ResultSetMetaData详细

DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 ResultSet 关于某个表的信息或一...

1212
来自专栏Java进阶之路

IK分词器访问远程词典功能实现

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最...

1632
来自专栏Python

Django---ORM操作大全

前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:...

77610
来自专栏恰同学骚年

走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器

  SELECT 以表格的方式输出,可以同时输出多个变量;而PRINT 则是以文本的方式输出,一次只能输出一个变量的值。

862

扫码关注云+社区