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

本文目录

    • 操作SQLite的小框架
    • 创建数据库
    • 新建封装数据库模板代码的模板类SQLiteTemplate
    • 在AS中使用这个框架操作SQLite
    • 小结

操作SQLite的小框架

SQLite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用SQLite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作SQLite,从而轻松的实现数据的操作。
而操作SQLite时,经常会反复写下面红框中的代码,可以说是SQLite的模板代码,接下来就将模板代码整合为一个小框架,让使用者轻松去使用数据库提供的相关功能。用一个简单的AS程序展示使用这个框架。
【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite模板代码成一个小框架_第1张图片

创建数据库

新建封装数据库操作的类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.新建界面按钮,以完成交互【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite模板代码成一个小框架_第2张图片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");
    }
}

运行程序看看效果
【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite模板代码成一个小框架_第3张图片
【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite模板代码成一个小框架_第4张图片

小结

  可以发现主界面的操作SQLite代码,简洁了许多,使用者只用编写必要的增删改查代码即可,并且编写的操作类、模板类可以移植,再要使用数据库操作时,直接复制自己写的操作类和模板类的java文件;

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

你可能感兴趣的:(Android)