SQLite
一、SQLite简介:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
二、SQLite具备下列特点:
1.轻量级。使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸相当小。
2.独立性。SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
3.隔离性。SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
4.跨平台。SQLite 目前支持大部分操作系统,不止电脑操作系统更在众多的手机系统也是能够运行,比如:Android。
5.多语言接口。SQLite 数据库支持多语言编程接口。
6.安全性。SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。
三、Android中的SQLite使用
1、SQLiteDatabase类:
SQLiteDatabase是一个数据库实例类, 它提供了一系列的方法管理, 操作数据库
(1) 创建数据库:
a)Static SQLiteDatabase openDatabase(String path, CursorFactory f,int flags);
打开由path指定的SQLite数据库
b)Static SQLiteDatabase openOrCreateDatabase(File file, CursorFactory f);
打开或创建由file指定的SQLite数据库
c)Static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory f);
打开或创建由path指定的SQLite数据库
(2) 操作数据库:
a) execSQL(String sql, Object[] bindArgs);
执行带占位符的SQL语句, 第二个参数表示SQL语句占位符对应的参数
b) execSQL(String sql);
执行SQL语句
c) rawQuery(String sql, String[] selectionArgs);
带占位符的查询语句, 第二个参数表示查询语句占位符对应的参数
d) Insert(String table, String nullColumnHack, ContentValue value);
参数:
Table: 表名, nullColumnHack: 表明强行插入null值的数据列的列名,
value: 代表一行记录数据
(ContentValue)类相当于Map, 提供put(String key, XXX value);存入数据, getXXX(key)用于取出数据
e) update(String table, ContentValues values, String whereClause, String[] whereArgs);
参数:
ContentValues: 你需要更新个数据组成的一个map,由列的名字和列的新值构成,null是合法的值,会被转化为NULL;
whereClause: SQL语句中的where子句, 满足whereClause的将被更新,
whereArgs: 字符串数组,和whereClause配合使用。有两种用法,如果whereClause的条件已经直接给出,如“class = “ + num,num是传入的参数,则whereArgs可设为null。如果是”class = ?“,则?会被whereArgs这个数组中对应的值替换,whereArgs给出?代表的值,有多个?的,字符串数组里的值依次填入。
f) delete (String table, String whereClause, String[] whereArgs);
table:表名;whereClause:删除的条件,用法和update里的一样。如果为null,则删除全部行。 whereArgs:用法和update里的一样。
g) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
对指定的表进行查询
h) query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
对指定表进行查询, 第一个参数表示是否去掉重复值, limit控制查询记录数(用于分页)
i) 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
j) BeginTransaction(); 开始事务
k) EndTracsaction(): 结束事务
其中结束事务时, 是提交事务还是回滚事务, 取决于是否调用setTransactionSuccessful()来设置事务标志, 如果程序事务中调用了该方法设置成功则提交事务, 否则将会回滚事务;
四、Cursor类
Cursor类似于jDBC中的ResultSet类用于记录查询结果, 提供如下方法:
(1) move(int offset);将记录指针向上或向下移动指定行数, offset为负表示向上移动, offset为正数表示向下移动
(2) boolean moveToFirst();将记录指针移动到第一行
(3) boolean moveToLast();将记录指针移动到最后一行
(4) boolean moveToNext();将记录指针移动到下一条记录
(5) boolean moveToPosition(int position);将记录指针移动到指定行
(6) boolean moveToPrevious();将记录指针移动到上一行.
(7) getXXX(); 获取一行记录中指定列的数据
(8)getCount() 总记录条数
(9)isFirst() 判断是否第一条记录
(10)isLast()判断是否最后一条记录
(11)SQLiteOpenHelper类介绍
实现代码:
Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标
if(c.moveToFirst()){//判断游标是否为空
for(int i=0;i<c.getCount();i++){
c.move(i);//移动到指定记录
String username = c.getString(c.getColumnIndex("username");
String password = c.getString(c.getColumnIndex("password"));
}
}
//通过rawQuery实现的带参数查询
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}
五、SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。
onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
SQLiteOpenHelper的其他方法:
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
构造方法,一般是传递一个要创建的数据库名称,和版本号参数
onCreate(SQLiteDatabase db)创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)版本更新时调用
getReadableDatabase()创建或打开一个只读数据库
getWritableDatabase()创建或打开一个读写数据库
Synchronized void close(); 关闭所有打开的SQLiteDatabase
例:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; //数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context) { //创建数据库
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) { //数据库初始化
String sql = "create table user(username varchar(20) not null , password varchar(60) not null );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //版本号不同时,执行的操作
}
}
创建数据库:
(调用getWriteableDatabase可能因为磁盘空间或权限问题失败,所以,一个好的习惯是在捕获异常后提供getReadableDatabase方法的结果)
DatabaseHelper database = new DatabaseHelper(this);
//这段代码放到Activity类中才用this
SQLiteDatabase db = null;
db = database.getReadalbeDatabase(); //打开数据库
------对数据库进行操作
db = database.close(); //关闭数据库