版权声明:https://blog.csdn.net/weixin_40811410 https://blog.csdn.net/weixin_40811410/article/details/81949856
一、Android 中SQLite 介绍
Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。
由于JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,会消耗太多的系统资源,对于手机这种内存受限设备来说并不合适。因此Android 提供了一些新的 API 来使用 SQLite 数据库。
数据库存储在 data/data/< 项目文件夹 >/databases/ 下。
二、Android 中SQLite数据库使用
2.1 创建数据库
在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助创建一个数据库,只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。
SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
- 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境,数据库名字,一个可选的游标工厂(通常是 Null),一个代表正在使用的数据库模型版本的整数。
- onCreate()方法,当数据库第一次被建立的时候被执行,一般把创建表,初始化数据等操作放在这里。
- onUpgrage() 方法,当数据库版本更新时会自动执行。
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 创建数据库后,对数据库的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改数据库版本的操作
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功打开数据库后首先被执行
}
}
2.2 SQLite数据库使用
- 创建一个DatabaseHelper 类,继承SQLiteOpenHelper,并在实现的方法中初始化,比如创建数据库等;
- 获取DatabaseHelper 的对象,并创建或打开一个可以读的数据库;
- 此时可以在打开的数据库中执行相应操作,如增、删、改、查操作等;
【SqliteDbHelper类】
package com.soul.ijreceiver;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 模块:
* 作者:soul
* 时间:2018/8/30:13:59
* 说明:
*/
public class SqliteDbHelper extends SQLiteOpenHelper
{
private static final int DB_VERSION = 1;
private static final String DB_NAME = "soul.db";
public static final String TABLE_NAME = "person";
public SqliteDbHelper(Context context)
{
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 调用时刻:当数据库第1次创建时调用
* 作用:创建数据库 表 & 初始化数据
* SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
String createTbStr = "create table if not exists "+TABLE_NAME+"( _id integer primary key, name varchar, age integer, sex varchar)";
sqLiteDatabase.execSQL(createTbStr);
// 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
// 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
}
/**
* 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)
* 作用:更新数据库表结构
* 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade()
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
{
//可重新建表
sqLiteDatabase.execSQL("drop table if exists "+TABLE_NAME);
onCreate(sqLiteDatabase);
//也可在表中新增列元素, 使用 SQL的ALTER语句
String sql = "alter table "+TABLE_NAME+" add job varchar";
sqLiteDatabase.execSQL(sql);
}
}
【SqliteDbManager类:SQLiteOpenHelper的工具类(可打开数据库,执行增删改查操作)】
package com.soul.ijreceiver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
* 模块:数据库
* 作者:soul
* 时间:2018/8/30:14:32
* 说明:
*/
public class SqliteDbManager
{
private static SqliteDbManager mInstance = null;
private SQLiteDatabase mDb = null;
private SqliteDbHelper mDbHelper = null;
public static SqliteDbManager getInstance()
{
if (mInstance == null)
{
mInstance = new SqliteDbManager();
}
return mInstance;
}
public void setSqliteDbOpen(Context context)
{
mDbHelper = new SqliteDbHelper(context.getApplicationContext());
mDb = mDbHelper.getWritableDatabase();
}
public void insertTb(String tbName)
{
openDb();
//方法一:
ContentValues contentValues = new ContentValues();
contentValues.put("name","zhangsan");
contentValues.put("age",18);
contentValues.put("sex","男");
mDb.insert(tbName,null,contentValues);
//方法二:
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('李四',20,'女')");
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('王五',22,'女')");
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('哈利',21,'男')");
closeDb();
}
public void deleteTb(String tbName)
{
openDb();
//方法一:
mDb.delete(tbName,"name=?",new String[]{"zhangsan"});
//方法二:
mDb.execSQL("delete from "+tbName+" where name = '李四'");
closeDb();
}
public void updateTb(String tbName)
{
openDb();
//方法一:
ContentValues contentValues = new ContentValues();
contentValues.put("name","隔壁老王");
contentValues.put("sex","男");
mDb.update(tbName,contentValues,"name=?",new String[]{"王五"});
//方法二:
mDb.execSQL("update "+tbName+" set name = '哈利波特',age = '16' where name = '哈利'");
closeDb();
}
public void queryTb(String tbName)
{
openDb();
//方法一:
Cursor cursor = mDb.query(tbName, new String[]{"name","sex","age"}, "name=?", new String[]{"隔壁老王"}, null, null, null);
//将光标移动到下一行,从而判断该结果集是否还有下一条数据;如果有则返回true,没有则返回false
if (null != cursor)
{
while (cursor.moveToNext())
{
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
Log.i("????","name = "+name+"; age = "+age+"; sex = "+sex);
}
cursor.close();
}
//方法二:使用sql语句
Cursor rawQuery = mDb.rawQuery("select * from " + tbName+" where name=?", new String[]{"哈利波特"});
if (null != rawQuery)
{
while (rawQuery.moveToNext())
{
String _id = rawQuery.getString(rawQuery.getColumnIndex("_id"));
String name = rawQuery.getString(rawQuery.getColumnIndex("name"));
int age = rawQuery.getInt(rawQuery.getColumnIndex("age"));
String sex = rawQuery.getString(rawQuery.getColumnIndex("sex"));
Log.i("????","_id = "+_id+"; name = "+name+"; age = "+age+"; sex = "+sex);
}
rawQuery.close();
}
closeDb();
}
/**
* 创建或打开一个可以读的数据库
*/
private void openDb() {
if (this.mDbHelper != null) {
try {
mDb = mDbHelper.getWritableDatabase();
} catch (Exception e) {
mDb = mDbHelper.getReadableDatabase();
e.printStackTrace();
}
}
}
/**
* 关闭数据库
*/
private void closeDb() {
try {
if (mDb != null) {
mDb.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
下一篇:分享对SQLite数据封装的心得。
YunSoul技术分享,扫码关注微信公众号
-
——只要你学会了之前所不会的东西,只要今天的你强过了昨天的你,那你就一直是在进阶的路上了。