【幻化万千戏红尘】qianfeng-Android-Day13_SQLiteOpenHelper

SQL基础入门

.数据库查询语句:select

1. 查询所有数据:

select * from 表名;

select * from exam_books;

2.按照一定的条件查找:

select * from 表名 where 条件;

select * from user where id<20;

3.范围条件查询:

select * from 表名 where 字段 between  1  and 2 ;

select * from user where id<20 and id>10;

select * from user where id between 10 and 20;

select * from user where addtime between '2011-03-17 00:00:00' and '2011-03-18 00:00:00';

4.模糊查询:

select * from 表名 where 字段 like '%条件%';

select * from user where username like '%马克思%';

select * from user where username like '__';

(查询书名中第一个字是,后面有两个字)

%_叫做通配符

5.查询个数:

select count(*) from 表名 where 条件

select count(*) as 别名 from username  where _id = '03706' and username = 2;

6.查询结果按顺序排列:

正序、倒序(asc/desc

select * from 表名 where 条件 order by 字段 desc/asc;

select * from user where coursecode = '03706' order by chapterid;

7、按照limit查找某个范围内的数据:

SELECT  * FROM user  order by id asc  limit  0, 15;(代表查找出的第一页的信息)

SELECT  * FROM user  order by id asc  limit 15, 15;(代表查找出的第二页的信息)

【备注:】limit后面的两个数字中:第一个代表偏移量,第二个代表每页展示的数量

                偏移量 = (当前页码数-1* 每页显示条数

SELECT 字段 AS  别名  FROM 表名 WHERE...   ORDER BY ...  LIMIT....

8sql常用函数:

count()

min()

max()

9group by分组查询

select name ,sum(score) from students group by name having name='xxx'

. 删除数据:delete

delete from 表名 where 条件;

delete from user where id<2000;

delete from user where id='00041'

DELETE    FROM    表名    WHERE子句

.插入新数据:insert

insert into 表名(字段) values(); 

insert into user values(null,'zhangsan','132456','张三')

.更新数据:update

update 表名 set 字段1=1, 字段2=2 where 条件;

update user set password='888' where username='lisi' 

五、创建表结构的语句:

CREATE TABLE  表名 (_id INTEGER PRIMARY KEY AUTOINCREMENT , 字段2, 字段3...)

例如:CREATE TABLE user (_id INTEGER PRIMARY KEY AUTOINCREMENT , words  , detail );

六、更新表结构的语句

1、如需在表中添加列,请使用下列语法:

ALTER TABLE table_name

ADD column_name datatype

关于SQLite

CRUD:是指在做计算处理时的增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述数据库的基本操作。

SQLite支持哪些数据类型?

1)、NULL 值为NULL

2)、INTEGER 值为带符号的整型,根据类别用1,2,3,4,6,8字节存储

3)、REAL 值为浮点型,8字节存储

4)、TEXT 值为text字符串,使用数据库编码(UTF-8, UTF-16BE or UTF-16-LE)存储

5)、BLOB 值为二进制数据,具体看实际输入

实际上:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么,对于SQLite来说字段不指定类型是完全有效的.

虽然理论上SQLite只支持以上五种数据类型,但是如果写成以下数据类型,sqlite3也能够接受:

  • smallint  16 位元的整数 
  • interger  32 位元的整数 
  • decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值 ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。 
  • float   32位元的实数。 
  • double   64位元的实数。 
  • char(n)   n 长度的字串,n不能超过 254。 
  • varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。 
  • graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。 
  • vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。 
  • date   包含了 年份、月份、日期。 
  • time   包含了 小时、分钟、秒。 
  • timestamp  包含了 年、月、日、时、分、秒、千分之一秒。

一、SQLiteOpenHelper

(一)、引入:

        在编写数据库应用软件时,需要考虑这样的问题:我们开发的软件如果应用使用到SQLite数据库,我们必须在用户初次使用软件时创建出数据库表结构及添加一些初始化记录;另外在软件升级的时候,也需要对数据表结构进行更新。

        如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?

        所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类。

        SQLiteOpenHelper是系统提供的一个管理数据库表创建版本管理(尤其是版本更新)的抽象类,我们必须通过继承SQLiteOpenHelper来实现自己的工具类。 一般我们要重写三个方法,构造器onCreate方法、onUpgrade方法。

         为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是:

  • onCreate(SQLiteDatabase db)
  • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

        前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

1、当调用SQLiteOpenHelpergetWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

2onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。 

(二)、SQLiteOpenHelper 类的使用步骤:【重点

  1. 创建SQLiteOpenHelper类的子类MySQLiteOpenHelper 类,实现SQLiteOpenHelper类中的抽象方法onCreate()onUpgrade()
  2. 调用 MySQLiteOpenHelper 对象的getWritableDatabase  getReadableDatabase方法,获得SQLiteDatabase 对象;
  3. 创建表
  4. 调用SQLiteDatabase 对象的execSQL()方法,执行 updateinsertdelete操作;调用rawQuery()方法执行select查询操作;
  5. 如果执行的是查询操作,则对返回的Cursor进一步处理。

(三)、SQLiteOpenHelper类中常用方法:

  • onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
  • onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。

【备注:】除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。

  • getWritableDatabase()    创建一个可读写数据库
  • getReadableDatabase()     创建一个可读写数据库

【备注:】调用getReadableDatabase 方法返回的并不总是只读数据库对象,一般来说该方法和getWriteableDatabase 方法的返回情况相同,只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。而getWriteableDatabase()方法打开的数据库,一旦数据库磁盘空间满了,就只能读而不能写,如果再写则报错。因此建议使用getReadableDatabase()方法来获打开数据库。getWritableDatabase()getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

(四)、封装MySQLiteOpenHelper 类:

(一)、封装的目的:

        为了工作方便,为了提高代码重用性,将重复写的代码封装起来。

        封装的原则:要注意粒度和耦合性。要尽量做到耦合性低。

(二)、封装 MySQLiteOpenHelper  类的核心代码:

原文地址:https://www.cnblogs.com/weigongcheng/p/5886434.html