【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite模板代码成一个小框架

操作SQLite的小框架

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

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();
    }
}

在AS中使用这个框架操作SQLite

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文件;

欢迎点赞评论,指出不足,笔者由衷感谢哦!~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值