SQLite是一种轻量级的数据库,支持结构化查询语言。
具有以下集合特点:
1. 轻量级
2. 独立性
3. 隔离性
4. 跨平台
5. 多语言接口
6. 安全性
SQLite能存储的数据类型和SQL Server 等数据库稍微有点不同,它具有以下几种数据类型:
1. NULL:空值。
2. INTEGER:有符号整数,存储在1、2、3、4、6或8个字节中。
3. REAL:浮点数,存储为8字节的IEEE浮点数。
4. TEXT:文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储。
5. DLOB:大块数据(二进制数据)
Android中SQLite的使用
首先,创建数据库
第一种方法:先创建一个数据库类,也就是创建一个类继承SQLiteOpenHelper类。
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,是系统提供的一个管理数据库表创建和版本管理(尤其是版本更新)的抽象类,我们必须通过继承SQLiteOpenHelper来实现自己的工具类。一般我们要重写三个方法,构造器、onCreate方法、onUpgrade方法。
它的部分方法描述:
- SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int
version) 构造方法:一般是传递一个要创建的数据库名称 - onCreate(SQLiteDatabase db) 用于初次使用软件时生成数据库、表
- onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用,更新数据库表结构
- getReadableDatabase() 创建或打开一个只读数据库
- getWritableDatabase() 创建或打开一个读写数据库
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
public class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
db.execSQL("create table t_user(_id integer primary key ,name text,sex text,image text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
然后通过调用了、SQLiteOpenHelper类的 getWritableDatabase()方法来实现创建一个数据库。
DbHelper helper = new DbHelper(MainActivity.this);
SQLiteDatabase db = helper.getWritableDatabase();
创建数据库方法二:通过Context的OpenCreateDatabas()方法来创建数据库实例。
openOrCreateDatabase(name, mode, factory);
它的三个参数:
- name:数据库名:可通过Context.getDatabasePath(“test.db”);获取保存路径,保存在/data/data/com.xxx.xxx/databases目录下。
- mode:打开模式,共有六种,分别是:
- MODE_APPEND
- MODE_ENABLE_WRITE_AHEAD_LOGGING
- MODE_MULTI_PROCESS
- MODE_PRIVATE(这个是常用的)
- MODE_WORLD_READABLE
- MODE_WORLD_WRITEABLE
- factory:游标工厂,我下面代码的是采用默认的,直接null
public void createDatabase(View view) {
// 先拿到SqliteDatabase对象实例、若数据库不存在则创建数据库
SQLiteDatabase db = openOrCreateDatabase("QQ.db", MODE_PRIVATE, null);
// 创建SQL语句
String sql_create = "create table user(_id integer primary key autoincrement, name text not null,password text)";
// 执行SQL语句
db.execSQL(sql_create);
}
注意:像示例里那样创建表代码块只能创建一次,否则会报错表已存在)。
创建表SQL语句:CREATE TABLE 表名(字段名 字段类型,字段名2 字段类型)
CREATE TABLE if not exists tablename(); 如果表不存在,就创建
CREATE TABLE tablename(_id integer primary key autoincrement,name text not null,password text not null)
其中:
- id integer primary key autoincrement: id字段作为主关键字段,并自增
- primary key:主键关键字
- autoincrement:自增
对表进行更、删、改、查等操作
我们可以通过SQLiteDatabase类为我们提供的方法进行操作,也可以通过SQL语句进行操作
SQLiteDatabase类为我们提供了很多种方法,较常用的方法如下:
- (int) delete(String table,String whereClause,String[]
whereArgs) 删除数据行的便捷方法 - (long) insert(String table,String nullColumnHack,ContentValues
values) 添加数据行的便捷方法 - (int)update(String table, ContentValues values, String whereClause,String[] whereArgs) 更新数据行的便捷方法
- (void) execSQL(String sql) 执行一个SQL语句,可以是一个select或其他的sql语句
- (void) close() 关闭数据库
- (Cursor) query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having, String
orderBy, String limit) 查询指定的数据表返回一个带游标的数据集 - (Cursor) rawQuery(String sql, String[]
selectionArgs) 运行一个预置的SQL语句,返回带游标的数据集
数据的添加:
1.通过execSQL方法
String sql_insertString =
"insert into user(name,password) values('admin','123456')";
db.execSQL(sql_insertString);
2、使用insert方法
insert(table, nullColumnHack, values);
参数一:要插入数据的表名
参数二:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个
列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。- 参数三:ContentValues,存放键值对,键是对应数据库中的字段名
// 1.准备要插入的数据,放到ContentValues
ContentValues values = new ContentValues();
values.put("name", "张三丰");
values.put("password", "123456");
// 2.db.insert,返回的是当前插入的记录的id,如果是-1表示插入失败
long insert = db.insert("user", null, values);
数据的更新:
在更新时如果不写条件,将会更改所有数据。
1.通过execSQL方法
db.execSQL("update user set password='admin' where name='张三丰'");
2、使用update方法
update(table, values, whereClause, whereArgs);
参数一:表名
参数二:ContentValues,修改后的数据
参数三:条件表达式
参数四:满足条件表达式的值
ContentValues values = new ContentValues();
values.put("password", "aaaaaa");
//第四个参数为字符串数组
//返回值为int表示该方法执行后影响多少条数据
db.update("user", values, "_id=?", new String[]{"20"});
数据的删除:
1.使用execSQL方法
db.execSQL("delete from user where _id=1");
2.使用delete方法
delete(table, whereClause, whereArgs);
参数一:表名
参数二:条件表达式
参数三:满足条件表达式的值
db.delete("user", "_id>?", new String[]{"5"});
数据的查询:
1.SQL语句:SELECT * FROM user WHERE 条件
调用SQLDatabase的rawQuery方法,返回Cursor游标,并且游标指针指向的是第一条数据的前面。
rawQuery(sql, selectionArgs)
第一个参数为select语句
第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null
// 查询数据
String querySql = "SELECT * FROM user";
Cursor cs = db.rawQuery(querySql, null);
while (cs.moveToNext()) {
Log.d("TAG", cs.getString(1));
}
其中,cusor.getXxx(int 列号),如果不知道列号,可cs.getColumnIndex(“字段名”)获取列号。
2.SQLiteDatabase.query()
query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
参数一:String table 表名
参数二:String[] columns 要返回的列,如果写null,将返回所有列,一般不建议这么写
参数三: String selection 条件,可以写成 字段名=? ,如果有多条件,可用or或and:name=? or name=?
参数四:String[]
selectionArgs 条件满足的值,与参数三的个数要一一致,如果参数三是一个条件,则只有一个,如果参数三有多个值,则这里应该对应多个参数五: String groupBy 分组方式,若为空则不分组
参数六:String having 分组滤过条件,必须与group by联用
参数七:String orderBy 排序方式
Cursor cs = db.query("user", new String[] { "name", "password" },
"name=?", new String[] { "张三丰" }, null, null, null);
查询结果Cursor的常用方法:
move(int offset) 按偏移量来移动
moveToLast () 将记录指针移动到最后一行
moveToNext () 将记录指针移动到下一行
moveToPosition(int position) 将记录指针移动到指定的一行
moveToPrevious() 将记录指针移动到上一行
getCount() 返回Cursor的行数
getColumnName(int index) 根据列的索引返回其相应的列名称
getColumnIndex(String name) 根据列的名字返回其相应的索引
getColumnNames() 返回一个保存有所有列名称的字符串数组
getColumnCount() 返回列的总数
close() 关闭游标结果集,释放资源
getType() 获取字段的数据类型。分别有0、1、2、3、4这几个结果
- 0: 代表null
- 1:代表int
- 2:代表float
- 3:代表String
- 4:代表blob