一、简介
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
二、特点
1、轻量级:一个动态库、单个文件
2、独立性:没有依赖、无需安装
3、隔离性:全部在一个文件夹中
4、跨平台:支持众多操作系统
5、多语言接口:支持多语言编程接口
6、安全性:通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。
三、数据类型支持:
1、NULL : 空值
2、INTEGER : 整数型
3、REAL : 浮点值
4、TEXT : 字符串值
5、BLOB : 二进制对象
四、常用方法
1、获取SQLiteDatabase对象:
this.openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory)
参数: name : 数据库名称
mode:读写模式
factory:游标工厂类
this.openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
参数: name : 数据库名称
mode:读写模式
factory:游标工厂类
errorHandler:数据库发生错误时的处理类
2、SQLiteDatabase对象的方法
db.execSQL(String sql)
参数 sql : sql语句
db.insert(String table, String nullColumnHack, ContentValues values)
参数 table : 表名
nullColumnHack:values参数为空时要创建的列,存放values这个空值
values : 键值对形式的ContentValues对象
db.delete(table, whereClause, whereArgs)
参数 table : 表名
whereClause : SQL带’?’的条件语句
whereArgs : 填充’?’的字符串值数组
db.update(table, values, whereClause, whereArgs)
参数 table : 表名
whereClause : SQL带’?’的条件语句
whereArgs : 填充’?’的字符串值数组
public Cursor rawQuery(String sql, String[] selectionArgs)
参数 sql: sql语句
selectionArgs: 绑定为字符串数组的值
public Cursor rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)
参数 sql: sql语句
selectionArgs: 绑定为字符串数组的值
cancellationSignal:取消执行信号
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
参数 table:表名称
colums:列名称数组
selection:条件子句,相当于where
selectionArgs:条件语句的参数数组
groupBy:分组
having:分组条件
orderBy:排序类
limit:分页查询的限制
Cursor:返回值,相当于结果集ResultSet
五、关于游标Cursor对象
1、说明:
Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cursor最终会释放掉。然而如果Cursor的数据量特别大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动将Cursor close掉,因为在源码中我们发现,如果等到垃圾回收器来回收时,也就是如果不手动关闭,系统会报错,会给用户以错误提示。
2、Cursor的方法
close(): 关闭游标对象
getCount(): 总记录条数
getColumnNames:获取所有列名称
isFirst(): 判断是否第一条记录
isLast(): 判断是否最后一条记录
moveToFirst(): 移动到第一条记录
moveToLast(): 移动到最后一条记录
move(int offset): 移动到指定的记录
moveToNext(): 移动到下一条记录
moveToPrevious(): 移动到上一条记录
getColumnIndex(String columnName): 获得指定列索引的int类型值
getInt(int columnIndex): 获得指定列索引的int类型值
getString(int columnIndex): 获得指定列索引的String类型值
六、关于SQLiteOpenHelper
1、说明:
是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新;一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法
2、方法
onCreate(SQLiteDatabase db): 创建数据库时调用
onUpgrade(SQLiteDatabase db, int oldVersion, int new Version): 版本更新是调用
getReadableDatabase(): 创建或者打开一个只读数据库
getWritableDatabase(): 创建或者打开一个读写数据库
七、示例
1、用法一
SQLiteDatabase db = openOrCreateDatabase("test1.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists mytable ( _id integer primary key autoincrement, name text not null, age int not null)");
db.execSQL("insert into mytable(name, age) values('小雨',18)");
db.execSQL("insert into mytable(name, age) values('雨阳',20)");
Cursor cursor = db.rawQuery("select * from mytable ", null);
String txt = "";
if(cursor != null){
while(cursor.moveToNext()){
txt += "姓名:" + cursor.getString(cursor.getColumnIndex("name"))+"; 年龄:" +
cursor.getInt(cursor.getColumnIndex("age"))+"\n";
}
cursor.close();
}
//清空表数据(这里为了方便测试)
//db.execSQL("drop table mytable");
db.delete("mytable", "name like ?", new String[]{"小雨","雨阳"});
db.delete("mytable", "age like ?", new String[]{"18","20"});
db.close();
Toast.makeText(this,"执行后,再查询的结果:\n"+txt, 0).show();
2、用法二
SQLiteDatabase db = openOrCreateDatabase("test2.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists mytable(_id integer primary key autoincrement,name text not null,age integer not null)");
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 19);
db.insert("mytable", null, values);
values.clear();
values.put("name", "张三丰");
values.put("age", 99);
db.insert("mytable", null, values);
values.clear();
values.put("name", "张三封");
values.put("age", 29);
db.insert("mytable", null, values);
values.clear();
values.put("age", 88);
db.update("mytable", values, "_id>?", new String[]{"3"});//将全部id>3的人的年龄改成88
db.delete("mytable", "name like ?", new String[]{"%丰%"});//删除所有名字中带有丰的人
Cursor c = db.query("mytable", null, "_id>?", new String[]{"0"}, null, null, "name");
if (c!=null) {
String text = "";
String [] columns= c.getColumnNames();
while (c.moveToNext()) {
for (String columnName : columns) {
text += c.getString(c.getColumnIndex(columnName))+" ";
}
}
c.close();
tv.setText(text);
}
//清空表数据(这里为了方便测试)
db.execSQL("drop table mytable");
//db.execSQL("delete from mytable");
db.close();
3、用法三
<span style="font-size:18px;">DBOpenHelper helper = new DBOpenHelper(Activity2SQLite.this, "test3.db");
SQLiteDatabase db = helper.getWritableDatabase();//获取可读可写的对象
Cursor c = db.rawQuery("select * from mytable", null);
游标操作和上面的一样,这里就不再详细写了。
DBOpenHelper 类如下:
package com.sqb.demo2;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper{
public DBOpenHelper(Context context, String name){
/**
* 改写super的参数
*/
super(context, name, null, 1);
// TODO Auto-generated constructor stub
}
public DBOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
/**
* 首次创建数据库的时候调用,一般可以把建库、建表的操作放到这个方法来执行
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table if not exists mytable(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");
db.execSQL("insert into mytable(name,sex,age)values('张三','女',18)");
}
/**
* 当数据库的版本发生变化的时候会自动执行
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}</span>