关于重新认识SQlite(一)
虽然做安卓接触到数据库的机会没有后台那么多,但是最近发现还是有蛮多机会会遇到,做了五年安卓倒是提起SQlite还要请教后台的同事,让我感到分外惭愧,所以今天决定重新认识下SQlite。
常用数据库的种类
Oracle、MySQL、SQLSever,SQlite等
SQlite简介
SQlite是目前为止比较流行的开源嵌入式数据库,属于轻量级、跨平台的关系型数据库,其主要优势在于灵巧、快速和可靠性高,并且占用资源非常低,能够支持多个主流的操作系统,例如Windows/Linux/Unix等等。
Android对于SQlite的使用
Android提供SQLiteOpenHelper.java作为数据库辅助操作工具类
第一步:创建类DatabaseHelper.class(可任意命名)继承SQLiteOpenHelper.java
public class DatabaseHelper extends SQLiteOpenHelper{
//带全部参数的构造函数,此构造函数必不可少
// 参数说明
// context:上下文对象
// name:数据库名称
// param:一个可选的游标工厂(通常是 Null)
// version:当前数据库的版本,值必须是整数并且是递增的状态
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
/**
*创建数据库sql语句并执行 user: 表名称 name: 字段名称
* 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
* 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
*/
//String sql = "create table user(name varchar(20))";
String sql = "create table user(id integer primary key auto_increment,name varchar(64))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
知识细节延伸:
1、id integer primary key auto_increment
id:字段名称
integer :字段类型
primary key:主键
autoincrement:通过设置主键进行自增长,默认从1开始,每次+1
2、SQLite 中有五种存储类型: NULL、INTEGER、REAL、TEXT、BLOB、VARCHAR等
SQLite数据库中的存储类型汇总
表中字段user可以使用text 或者varchar 类型,我选择使用varchar ,因为varchar 可以提供默认值,text 没有。
3、varchar(20)表示:
表示字符数,也就是,不论中文还是英文还是标点,加起来只能有20个。
表中字段名称user可以使用TEXT
第二步:创建数据库
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this, "数据库名称", null, 1);
db = dbHelper.getWritableDatabase();//可读写的数据库
// db = dbHelper.getReadableDatabase();//只读数据库
此处我创建的时可读写的数据库
1、SQLiteOpenHelper类 常用方法
-
创建数据库
getWritableDatabase()
创建/打开可读写的数据库(通过 返回的SQLiteDatabase对象 进行操作)getReadableDatabase()
创建/打开可读的数据库(通过 返回的SQLiteDatabase对象 进行操作)onCreate(SQLiteDatabase db)
数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
数据库升级时自动调用close()
关闭数据库 -
数据库操作(增、删、减、查)
查询数据
(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 cursor = sqliteDatabase.query("user", new String[] { "id","name" }, "id=?", new String[] { "1" }, null, null, null);
cursor.close()// 关闭游标,释放资源
(Cursor) rawQuery(String sql, String[] selectionArgs)
直接使用SQL语句进行查询的:SQL语句,条件参数
使用示例:
//写法一:
String sql = "select * from user where name=?";
Cursor cursor = db.rawQuery(sql, new String[]{"文阿花"});
//写法二:
String sql = "select * from user where name=文阿花";
Cursor cursor = db.rawQuery(sql, null);
query和rawQuery区别:
query是帮你拼接好了sql语句
rawQuery是使用你自己拼接的sqp语句
query比起rawQuery来说 可以避免因sql拼写错误儿导致的错误
(int) delete(String table,String whereClause,String[] whereArgs)
删除数据行
使用示例:
//根据主键去删除对应数据
// 参数1:表名(String)
// 参数2:WHERE表达式(String),需删除数据的行; 若该参数为 null, 就会删除所有行;?号是占位符
// 参数3:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符;
db.delete("user", "id?",new String[]{"1"});
对应sql语句:
String sql = "delete from user where id="1";
db.execSQL(sql);
(long) insert(String table,String nullColumnHack,ContentValues values)
添加数据行
使用示例:
//创建存放数据的ContentValues对象 insertData需要插入的内容
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "文阿花");
//数据库执行插入命令
db.insert("user", null, values);
对应sql语句:
String sql = "insert into user (id,name) values (1,'文阿花')";
db.execSQL(sql) ;
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
更新数据行
使用示例:
ContentValues values2 = new ContentValues();
values2.put("name", "文阿花2");
db.update("user", values2, "id= ?", new String[]{"1"});
对应sql语句:
String sql = "update [user] set name = '文阿花2' where id="1";
db.execSQL(sql);
(void) execSQL(String sql)
执行一个SQL语句,可以是一个select or 其他sql语句
使用示例:
//创建数据库sql语句 并 执行
String sql = "create table user(name varchar(20))";
db.execSQL(sql);
deleteDatabase(“数据库名”);
删除数据库