SQLlite在安卓中的基本详解和简单使用

一、基础介绍

1.SQLite 是一个进程内的库,是一种轻量级的、自给自足的、无服务器的、无需配置的,事务性的SQL数据库引擎.和他其他的数据库一样,SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite可以直接访问其存储文件。

SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,用C语言编写的开源嵌入式数据库引擎,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。

SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。

2.SQLite 是一个开源的嵌入式关系数据库。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。

3、SQLite的特点(SQLite’s Features and Philosophy)
3.1、零配置(Zero Configuration)
3.2、可移植(Portability):
它是运行在Windows,Linux,BSD,Mac OS X和一些商用Unix系统,比如Sun的Solaris,IBM的AIX,同样,它也可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE。
3.3、Compactness:
SQLite是被设计成轻量级,自包含的。one header file, one library, and you’re relational, no external database server required
3.4、简单(Simplicity)、灵活(Flexibility)、可靠(Reliability):
SQLite的核心大约有3万行标准C代码,这些代码都是模块化的,很容易阅读。
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。SQLite的整体结构图如下:
这里写图片描述

值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。

4.数据类型
SQLite为弱类型数据。
SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。因为定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME: 包含了 小时、分钟、秒。

二、数据库使用

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

onCreate(SQLiteDatabase db)

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

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

当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在
onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

public class DatabaseHelper extends SQLiteOpenHelper {  

        //类没有实例化,是不能用作父类构造器的参数,必须声明为静态  

         private static final String name = "count"; //数据库名称  

         private static final int version = 1; //数据库版本  更新之后改变数据库版本号
         public DatabaseHelper(Context context) {  
              //第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类  
                super(context, name, null, version);  
         }    
        @Override  
        public void onCreate(SQLiteDatabase db) {  
              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age 

INTEGER)");       
         }   
        @Override   
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
                 db.execSQL("ALTER TABLE person ADD phone VARCHAR(12)"); //往表中增加一列    
         }  

将会对比版本号,如果本身没有数据库,即数据库版本号为0,也就是第一次安装app,就会直接走onCreate方法,如果数据库本身已经存在了,如果版本号大于改版本号,就会执行onUpgrade方法。数据库版本只能升级,不能降级,降级会闪退。

三、基本语句:

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()
关闭数据库

1、建表语句:

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20),age integer default(0); 

主键自增,最高20位,default默认值。

2、插入

insert into person(name, age) values(‘小明’,3)  

3、删除

delete from person  where age=10;

4、更新

update person set name=‘小明‘ where age=10  

5、查询

select * from person       查询所有
select * from person order by id desc    降序查询,asc是升序

select name from person group by name having count(*)>1    分组查询 

select * from Account limit 5 offset 3         分页查询    

6、对表进行操作alert

增加一列: alert(into) person add address varchar(255);

删除列: alert person drop column age;

重命名列: alert person change age age_number integer;

**四、实例用法:**

写法,传统的一般的sql语句和insert方法,除了用execSQL()之外,还有
insert()、delete()、update()和query()  能完成数据的添加、删除、更新、查询操作。

1、插入
(1)
SQLiteDatabase db = ....;   
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"炸死特", 4});     
db.close();  

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
用占位符可以省去转义的痛苦。以免里面参数多次进行转义。
(2)
Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放,ContentValues类似于map集合,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法,  key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。

SQLiteDatabase db = databaseHelper.getWritableDatabase();    
ContentValues values = new ContentValues();    
values.put("name", "炸死特");    
values.put("age", 4);    
long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关  

2、查询:

(1)
SQLiteDatabase db = ….;
Cursor cursor = db.rawQuery(“select * from person where name like ? and age=?”, new String[]{“%炸死特%”, “4”});
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase();    
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%炸死特%"}, null, null, "personid  desc", "1,2");  

while (cursor.moveToNext()) {  
         int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始   
          String name = cursor.getString(1);//获取第二列的值  
          int age = cursor.getInt(2);//获取第三列的值   
}   
cursor.close();  
db.close();       
query参数,
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各

**参数的含义:**
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。
3.删除
(1)DELETE FROM table_name
或者:
DELETE * FROM table_name
     当然要加上条件判断,
   SQLiteDatabase db = databaseHelper.getWritableDatabase();  
  db.execSQL("delete from  table person where age >2 ");  
  db.close();  
(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase();  
db.delete("person", "personid<?", new String[]{"2"});  
db.close();  

上面代码用于从person表中删除personid小于2的记录。
第一个是表名,第二个参数是条件,相当于where personid<    ,?是占位符,内容是第三个参数。
5.update()方法
(1)

SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL(“update person set name=’呵呵’ where personid=1”);
db.close();
“`
(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(“name”, “呵呵”);//key为字段名,value为值
db.update(“person”, values, “personid=?”, new String[]{“1”});
db.close();

上面代码用于把person表中personid等于1的记录的name字段的值改为“呵呵”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值