SQLite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用SQLite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作SQLite,从而轻松的实现数据的操作。
而操作SQLite时,经常会反复写下面红框中的代码,可以说是SQLite的模板代码,接下来就将模板代码整合为一个小框架,让使用者轻松去使用数据库提供的相关功能。用一个简单的AS程序展示使用这个框架。
新建封装数据库操作的类MySQLiteOpenHelper继承自SQLiteOpenHelper (Android为我们专门提供的一个帮助类)
MySQLiteOpenHelper.java
package com.example.sqlite_myframe;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
//上下文
private static Context context;
//数据库版本号
//为了便于重用和防止不一致错误,将数据库名,表名,字段名都抽出为常量
private static int versionDB = 4;
private final static String dbName = "UserDB";//数据库名
private final static String tableName = "information";//表名
private static String colName = "name";//列名
private static String colPrice = "price";//列名
public static String getTableName() {
return tableName;
}
public static String getColName() {
return colName;
}
public static String getColPrice() {
return colPrice;
}
//考虑到版本问题,设计了两个构造方法
public MySQLiteOpenHelper(Context context, int versionDB) {
super(context, dbName, null, versionDB);
this.context = context; //上下文
this.versionDB = versionDB; //数据库版本号
Log.v("DAB", "MySQLiteOpenHelper: 构造方法");
}
public MySQLiteOpenHelper(Context context) {
this(context, versionDB);
}
//当数据库创建的时候被调用
@Override
public void onCreate(SQLiteDatabase db) {
//创建了数据库并创建一个叫 information 的表
//SQLite 数据创建支持的数据类型:整型数据,字符串类型,日期类型,二进制的数据类型
//使用SQL创建数据库,设计一个记录表
//Create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer);
String sql = "create table " + tableName + "(id integer primary key autoincrement," +
colName + " varchar(20)," + colPrice + " integer)";
Log.v("DAB", "MySQLiteOpenHelper:onCreate():sql=" + sql);
//execSQL 用于执行SQL 语句(对大小写不敏感), 完成数据库的创建
db.execSQL(sql);
//数据库实际上是没有被创建或者打开的,
//到调用 getWritableDatabase ()或 getReadableDatabase () 时才会进行创建或者打开
}
//数据库升级时调用
//如果 DATABASE_VERSION值被改为 2,系统发现现有数据库版本不同 ,即会调用 onUpgrade ()方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v("DAB", "MySQLiteOpenHelper:onUpgrade(),更新数据库版本为:" + newVersion);
}
}
SQLiteTemplate.java
package com.example.sqlite_myframe;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
//AS中,操作SQLite数据库中有许多模板代码
//将他们整合为一个小框架,封装成类,用时直接调用
//让我们能轻松去使用数据库提供的相关功能
//本着一个java文件最好一个类,就没有和继承SQLiteOpenHelper的操作类放在一起
//下面是我写的模板类SQLiteTemplate
public class SQLiteTemplate extends MySQLiteOpenHelper{
//声明部分
private static MySQLiteOpenHelper dbHelper;
private static SQLiteDatabase sqliteDatabase;
private static Context context;
//模板类需要继承自己写的操作类MySQLiteOpenHelper,也要有两个构造方法
public SQLiteTemplate(Context context, int versionDB) {
super(context, versionDB);
}
public SQLiteTemplate(Context context) {
super(context);
this.context=context;
}
public static MySQLiteOpenHelper getDbHelper() {
//创建 SQLiteOpenHelper 子类对象
dbHelper=new MySQLiteOpenHelper(context);
return dbHelper;
}
public static SQLiteDatabase getSqliteDatabase() {
//调用 getWritableDatabase ()方法创建或打开一个可以读的数据库
sqliteDatabase=dbHelper.getWritableDatabase();
return sqliteDatabase;
}
public static void getSqliteDatabase(String sql) {
//增删改操作即可用insert//delete/query,也可用execSQL()方法
//实际开发时,建议都使用SQL语句,比较通用;
sqliteDatabase.execSQL(sql);
//关闭数据库
sqliteDatabase.close();
}
}
1.新建界面按钮,以完成交互2.编写主界面的java代码,完成逻辑
MainActivity.java
package com.example.sqlite_myframe;
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
//声明我的封装类,并调用构造方法
private final SQLiteTemplate sqLiteTemplate=new SQLiteTemplate(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//创建数据库
public void onClick_CreatDB(View view) {
Log.v("DAB", "CreatDB");
SQLiteTemplate.getDbHelper();
SQLiteTemplate.getSqliteDatabase();
}
//插入数据操作
public void onClick_Insert(View view) {
Log.v("DAB", "onClick_Insert");
SQLiteTemplate.getDbHelper();
SQLiteTemplate.getSqliteDatabase();
//使用sql语句(对大小写不敏感),使用时注意语句间要有空格
//sql插入语法:INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)
String sql = "insert into " + MySQLiteOpenHelper.getTableName() + "(" + MySQLiteOpenHelper.getColName() +
"," + MySQLiteOpenHelper.getColPrice() + ") values('怡宝',2),('脉动',4),('体质能量',5)";
Log.v("DAB", "sql=" + sql);
SQLiteTemplate.getSqliteDatabase(sql);
}
//删除数据操作
public void onClick_Delete(View view) {
Log.v("DAB", "onClick_Delete");
SQLiteTemplate.getDbHelper();
SQLiteTemplate.getSqliteDatabase();
//sql删除语法:DELETE FROM 表名称 WHERE 列名称 = 值
String sql="delete from "+MySQLiteOpenHelper.getTableName()+" where id='2'";
Log.v("DAB", "delete的sql=" + sql);
SQLiteTemplate.getSqliteDatabase(sql);
}
//修改数据操作
public void onClick_Update(View view) {
Log.v("DAB", "onClick_Update");
SQLiteTemplate.getDbHelper();
SQLiteTemplate.getSqliteDatabase();
//sql更新语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
String sql = "update " + MySQLiteOpenHelper.getTableName() + " set " + MySQLiteOpenHelper.getColPrice() +
"=4.5 where " +MySQLiteOpenHelper.getColName()+"='脉动'";
//打印sql
Log.v("DAB", "update的sql=" + sql);
SQLiteTemplate.getSqliteDatabase(sql);
}
//查询数据操作
public void onClick_Query(View view) {
Log.v("DAB", "onClick_Query");
SQLiteTemplate.getDbHelper();
SQLiteTemplate.getSqliteDatabase();
//sql查询语法:SELECT 列名称 FROM 表名称
// 或者:SELECT * FROM 表名称
String sql = "select * from information where name=?";
//字符类的占位符写法要注意,sql中字符类占位符不能用单引号括起来
Cursor cursor = SQLiteTemplate.getSqliteDatabase().rawQuery(sql, new String[]{"脉动"});
Log.v("DAB", "rawQuery()查询到的数据是:\n");
while (cursor.moveToNext()) {//如有则true,没有则false
String id = cursor.getString(0);
String name=cursor.getString(cursor.getColumnIndex(MySQLiteOpenHelper.getColName()));
String price = cursor.getString(cursor.getColumnIndex(MySQLiteOpenHelper.getColPrice()));
//打印出查询结果
Log.v("DAB", "id: " + id +",name:"+name+ " " + "price: " + price);
}
//关闭数据库
SQLiteTemplate.getSqliteDatabase().close();
}
//删除数据库
public void onClick_DestroyDB(View view) {
Log.v("DAB", "onClick_DestroyDB");
//删除名为 UserDB.db 数据库
deleteDatabase("UserDB");
}
}
可以发现主界面的操作SQLite代码,简洁了许多,使用者只用编写必要的增删改查代码即可,并且编写的操作类、模板类可以移植,再要使用数据库操作时,直接复制自己写的操作类和模板类的java文件;
欢迎点赞评论,指出不足,笔者由衷感谢哦!~