SQLite介绍
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。SQLite采用的是动态数据类型,会根据存入值自动判断,具有以下五种常用的数据类型:
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。
SQLiteOpenHelper类
是 Android平台提供给我们一个数据库辅助类来创建或打开数据库,一般先继承这个类的实现相应的方法。再用该类的对象获取Database执行增删查改的操作。默认打开/data/data/package/databases/应用里的内部数据库执行管理。
- onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
- onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
public class JsonDbHelper extends SQLiteOpenHelper {
private static final String TAG = "JsonDbHelper";
private static final String DB_NAME = "json_db";//数据库名字
public static String TABLE_NAME = "json";// 表名
public static String FIELD_ID = "id";//
public static String FIELD_NAME = "name";// 接口名
public static String FIELD_TIME = "time";// 加载时间
public static String FIELD_CONTENT = "content";// 接口内容
private static final int DB_VERSION = 1; // 数据库版本
private static JsonDbHelper instance;
public static JsonDbHelper getHelper(Context context) {
if (instance == null)
instance = new JsonDbHelper(context);
return instance;
}
private JsonDbHelper(@Nullable Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表 SQL语句
//CREATE TABLE IF NOT EXISTS `runoob_tbl`(
// `runoob_id` INT UNSIGNED AUTO_INCREMENT,
// `runoob_title` VARCHAR(100) NOT NULL,
// `runoob_author` VARCHAR(40) NOT NULL,
// `submission_date` DATE,
// PRIMARY KEY ( `runoob_id` )
//)ENGINE=InnoDB DEFAULT CHARSET=utf8;
//SQLite采用的是动态数据类型,会根据存入值自动判断,具有以下五种常用的数据类型
//NULL 值是一个 NULL 值。
//INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
//REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
//TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
//BLOB 值是一个 blob 数据,完全根据它的输入存储。
String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
+ FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
+ FIELD_NAME + " TEXT NOT NULL , "
+ FIELD_TIME + " INTEGER NOT NULL , "
+ FIELD_CONTENT + " TEXT NOT NULL);";
try {
db.execSQL(sql);
} catch (SQLException e) {
Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//链接:https://juejin.im/post/59e7e5856fb9a0451542fb19
//构建删除表的SQL
String sql = "DROP TABLE IF EXISTS " + DB_NAME;
// 将原来的表和数据直接删除,然后再创建新的表,这是一种比较暴力而简单
db.execSQL(sql);
onCreate(db);
// 逐步升级的方案 较慢
// if (newVersion > 1) {
//
// }
// if (newVersion > 2) {
//
// }
}
}
SQLiteDatabase类
SQLiteOpenHelper的实现类的对象调用 getWritableDatabase(),getReadableDatabase()返回的实例就是这个类的实例。也可以通过SQLiteDatabase的静态方法返回实例:
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);
插入数据
- SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
参数1 表名称,
参数2 空列的默认值
参数3 ContentValues类型的一个封装了列名称和列值的Map;
private void insert(SQLiteDatabase db)
{
// 实例化常量值
ContentValues cValue = new ContentValues();
// 添加用户名
cValue.put("sname","xiaoming");
// 添加密码
cValue.put("snumber","01005");
// 调用insert()方法插入数据
db.insert("stu_table",null,cValue);
}
- 编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
private void insert(SQLiteDatabase db)
{
//插入数据SQL语句
String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";
//执行SQL语句
db.execSQL(sql);
}
删除数据
- 调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
参数1 表名称
参数2 删除条件
参数3 删除条件值数组
private void delete(SQLiteDatabase db)
{
// 删除条件
String whereClause = "id=?";
// 删除条件参数
String[] whereArgs = {String.valueOf(2)};
// 执行删除
db.delete("stu_table",whereClause,whereArgs);
}
- 编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除
private void delete(SQLiteDatabase db)
{
// 删除SQL语句
String sql = "delete from stu_table where _id = 6";
// 执行SQL语句
db.execSQL(sql);
}
修改数据
- 调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
参数1 表名称
参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件(where字句)
参数4 更新条件数组
private void update(SQLiteDatabase db)
{
// 实例化内容值
ContentValues values = new ContentValues();
// 在values中添加内容
values.put("snumber","101003");
// 修改条件
String whereClause = "id=?";
// 修改添加参数
String[] whereArgs={String.valuesOf(1)};
// 修改
db.update("usertable",values,whereClause,whereArgs);
}
- 编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新
private void update(SQLiteDatabase db)
{
// 修改SQL语句
String sql = "update stu_table set snumber = 654321 where id = 1";
// 执行SQL
db.execSQL(sql);
}
查询数据
- 在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
- 编写查询的SQL语句,获取Cursor 对象
Cursor cursor = database.rawQuery("SELECT * FROM " + JsonDbHelper.TABLE_NAME + " WHERE " + JsonDbHelper.FIELD_NAME + "=?"
, new String[]{name});
Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
getCount() 获得总的数据项数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列缩影的String类型值
示例:查询数据
private void query(SQLiteDatabase db)
{
// 查询获得游标
Cursor cursor = db.query ("usertable",null,null,null,null,null,null);
// 判断游标是否为空
if(cursor.moveToFirst()
{
// 遍历游标
for(int i=0;i
参考
Android黄金篇-SQLite数据库