首页 > 数据库 >Android中对于SQLite自带数据库的使用方法,附可直接使用方法(WDB与RDB)

Android中对于SQLite自带数据库的使用方法,附可直接使用方法(WDB与RDB)

时间:2024-12-04 11:59:34浏览次数:7  
标签:附可 SQLite String 数据库 tableName user RDB mWDB null

       本代码使用的Android版本:android-studio-2024.2.1.11-windows

        要先在java项目下创建一个DBHelper类来装载我们的代码,在其中获取WDB和RDB对象,来帮我们对于数据库进行操作,而不是一次又一次的写sql语句,我是比较热衷于调用读写实例完成操作,毕竟sql语句比较容易写错。

        基础模板如下:

package com.example.wechattest.AllHelper;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.example.wechattest.POJO.Friend;
import com.example.wechattest.POJO.User;
import java.util.ArrayList;
import java.util.List;

public class DBHelper extends SQLiteOpenHelper {
    //数据库名称           //这边名称为user.db
    private static String DB_NAME = "user.db";
    //数据库版本
    private static final int DB_VISION = 1;
    // 自己建造本身的唯一单例模式对象
    private static DBHelper mHelper = null;
    //后面主要是使用SQLiteDatabase 和 SQLiteDatabase 来实现操作(增删改查等)
    //数据库读实例
    private SQLiteDatabase mRDB = null;
    //数据库写实例
    private SQLiteDatabase mWDB = null;

    //调用父类构造方法(私有构造方法)
    private DBHelper(Context context) {
        //             数据库名        数据库版本
        super(context, DB_NAME, null, DB_VISION);
    }

    // 利用单例模式获取数据库帮助器的唯一实例
    public static DBHelper getInstance(Context context) {
        if (mHelper == null) {
            mHelper = new DBHelper(context);
        }
        return mHelper;
    }
    //获取读实例
    public SQLiteDatabase getmWDB() {
        return mWDB;
    }
    //获取写实例
    public SQLiteDatabase getmRDB() {
        return mRDB;
    }
    
    //创建打开数据库的读链接
    public SQLiteDatabase openReadLink() {
        //数据库实例为空或未打开时再建立连接
        if (mRDB == null || !mRDB.isOpen()) {
            mRDB = mHelper.getReadableDatabase();
        }
        return mRDB;
    }

    //创建打开数据库的写链接
    public SQLiteDatabase openWriteLink() {
        //数据库实例为空或未打开时再建立连接
        if (mWDB == null || !mWDB.isOpen()) {
            mWDB = mHelper.getWritableDatabase();
        }
        return mWDB;
    }

    //关闭数据库链接
    public void closeLink() {
        if (mRDB != null && mRDB.isOpen()) {
            mRDB.close();
            mRDB = null;
        }

        if (mWDB != null && mWDB.isOpen()) {
            mWDB.close();
            mWDB = null;
        }
    }

    //创建数据库,执行建表语句
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        //这部分创建表格sql语句需要更具自己的数据库需求来写
        String sql = "CREATE TABLE IF NOT EXISTS user_info " +
                "(AccountId INTEGER  PRIMARY KEY AUTOINCREMENT," +//账号编号
                //...数据库结构省略
                "temp3 VARCHAR NOT NULL," +//temp3
                "temp4 VARCHAR NOT NULL );";//temp4
        //执行sql语句
        sqLiteDatabase.execSQL(sql);
    }

    //更新数据库
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    //后续补充的方法插入在这个下面
    //...
}

下面是补充的方法,懒人可以改改直接使用:

        查找方法:

        检索在某一列中数值为field变量的一行(Cursor),封装成对象,加入Arraylist中返回

/**
     * @param tableName  您需要查的表格
     * @param field      按照Field列名来查表格
     * @param fieldValue 该列名所需要比对的数值
     * @return 返回一个查到符合料件的Object的list对象
     */
    public List<Object> queryByField_List(String tableName, String field, String fieldValue) {
        List<Object> list = new ArrayList<>();
        //根据读实例,获取一个充满信息的Cursor对象,后续进行遍历,便可以获取数据库中内容
        Cursor cursor = mRDB.query(tableName, null, field + "=?", new String[]{fieldValue}, null, null, null, null);
        //对比数据名称,对应多种情况的数据库获取信息
        if (tableName.equals("user_info")) {
            //如果数据库名为user_info,则将cursor内容遍历出来,用user来装载,后续放入list中,作为返回值传递出去
            //循环读取userInfo游标
            while (cursor.moveToNext()) {
                User user = new User();
                //获取数据库第对应的列
                user.setAccountId(cursor.getInt(0));
                //...内容重复性过长,省略cursor1-18的获取部分
                user.setTemp4(cursor.getString(19));
                list.add(user);
            }
            return list;
        }else if(tableName.split("_")[0].equals("user")){
            //如果数据库名为user_xxx,则将cursor内容遍历出来,用user来装载,后续放入list中,作为返回值传递出去
            //循环读取userInfo游标
            while (cursor.moveToNext()) {
                Friend friend = new Friend();
                //获取数据库第对应的列
                friend.setAccountId(cursor.getString(0));
                //...内容重复性过长,省略cursor1-17的获取部分
                friend.setTemp4(cursor.getString(18));
                list.add(friend);
            }
            return list;
        }else{
            //如果你有更多的表,可以再后面添加
            Log.d("error", "insertIntoTableByObject: DBHelper");
        }
        return null;
    }

         查找方法:

         根据所需对比字段,查询对应一行,返回所需的结果,返回值类型为该列的类型

/**
     * @param tableName  表名
     * @param field      根据类别查询
     * @param fieldValue 根据对应类别的值
     * @param resultType 查找的对应的列名,即返回的属性
     * @return 查找到的列名所对应的数值
     */
    public String queryByField_single(String tableName, String field, String fieldValue, String resultType) {
        List<User> list = new ArrayList<>();
        //根据读实例获取cursor
        Cursor cursor = mRDB.query(tableName, null, field + "=?", new String[]{fieldValue}, null, null, null, null);
        //获取field变量对应的列索引
        int indexFind = cursor.getColumnIndex(field);
        //获取所需返回值(resultType)变量对应的列索引
        int indexReturn = cursor.getColumnIndex(resultType);
        String Result = "";
        //循环读取对应表的游标
        while (cursor.moveToNext()) {
            if (cursor.getString(indexFind).equals(fieldValue)) {
                Result = cursor.getString(indexReturn);
            }
        }
        return Result;
    }

        查找方法:

        查找对应数据库中所有对象,并且封装成Object,返回Arraylist对象

/**
     * 查找表格中所有的对象
     *
     * @param tableName
     * @return
     */
    public List<Object> queryTable_All(String tableName) {
        List<Object> list = new ArrayList<>();
        //该部分其实和第一个查询,有很大的相似程度,只是更改读实例的检索条件↓
        Cursor cursor = mRDB.query(tableName, null, null, null, null, null, null, null);
        if (tableName.equals("user_info")) {
            //循环读取userInfo游标
            while (cursor.moveToNext()) {
                User user = new User();
                //获取数据库第对应的列
                user.setAccountId(cursor.getInt(0));
                //...内容重复性过长,省略cursor1-18的获取部分
                user.setTemp4(cursor.getString(19));
                list.add(user);
            }
            return list;
        }else if(tableName.split("_")[0].equals("user")){
            //循环读取userInfo游标
            while (cursor.moveToNext()) {
                Friend friend = new Friend();
                //获取数据库第对应的列
                friend.setAccountId(cursor.getString(0));
               //...内容重复性过长,省略cursor1-17的获取部分
                friend.setTemp4(cursor.getString(18));
                list.add(friend);
            }
            return list;
        }else{
            //如果你还有别的表,请在后面添加
            Log.d("error", "insertIntoTableByObject: DBHelper");
        }
        return null;
    }

        插入方法:

        查找对应数据库中所有对象,并且封装成Object,返回Arraylist对象

public Long insertIntoTableByObject(String tableName, Object object) {
        //创建一个新的ContentValues,用于存储键值对(存入数据库一一对应的数据)
        ContentValues contentValues = new ContentValues();
        if (tableName.equals("user_info")) {
            User user = (User) object;
            contentValues.put("WeChatId", user.getWeChatId());
            //省略过多重复的contentValues添加方法,根据所需数据库自行添加
            contentValues.put("Temp4", user.getTemp4());
        }else if(tableName.split("_")[0].equals("user")){//查找以user
            //Log.d("Code", "insertIntoTableByObject: 进入内部插入");
            Friend friend = (Friend)object;
            contentValues.put("AccountId",friend.getAccountId());
            //省略过多重复的contentValues添加方法,根据所需数据库自行添加
            contentValues.put("Temp4", friend.getTemp4());
        }else{
            Log.d("error", "insertIntoTableByObject: DBHelper");
        }
        //如果需要插入不同的表请在后面加使用else
        long i = 0;
        //TODO:事务处理
        try {
            //开始事务处理
            mWDB.beginTransaction();
            //              表名                            之前存储的键值对
            i = mWDB.insert(tableName, null, contentValues);
            //如果上面那条语句执行成功则事务传递成功,如果上面的语句出错则不会执行这条语句
            mWDB.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //结束事务处理
            mWDB.endTransaction();
        }
        return i;
    }

        删除方法:

        通过按照某一列名去查找一条数据来实现删除功能,一般列名为主键

/**
     * 通过按照某一列名去查找一条数据来实现删除功能,一般列名为主键
     *
     * @param tableName  删除的数据的表名
     * @param field      查找数据的列名
     * @param fieldValue 查找数据的值
     * @return
     */
    public Long deleteIntoTableByObject_Single(String tableName, String field, String fieldValue) {
        long i = 0;
        //TODO:事务处理
        try {
            //开始事务处理
            mWDB.beginTransaction();
            //                    表名
            i = mWDB.delete(tableName, "" + field + "=?", new String[]{fieldValue});
            //如果上面那条语句执行成功则事务传递成功,如果上面的语句出错则不会执行这条语句
            mWDB.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //结束事务处理
            mWDB.endTransaction();
        }
        return i;
    }

        修改方法:

        通过按照某一列名去查找一条数据来实现删除功能,一般列名为主键

/**
     * 根据查找到的对应列名的属性值,修改其这一列的结果
     *
     * @param tableName  修改的表格
     * @param object     修改后的对象
     * @param field      查找的列名
     * @param fieldValue 对应的值
     * @param updateField 更新的列
     * @param updateFieldValue 更新的值
     * @return
     */
    public Long updateIntoTableByObject(String tableName, Object object, String field, String fieldValue, String updateField, String updateFieldValue) {
        long i = 0;
        ContentValues contentValues = new ContentValues();
        if (tableName.equals("user_info")) {
            User user = (User) object;
            //获取值
            contentValues.put("WeChatId", user.getWeChatId());
            //省略过多重复的contentValues添加方法,根据所需数据库自行添加
            contentValues.put("Temp4", user.getTemp4());
        }else if(tableName.split("_")[0].equals("user")){//查找以user
            //Log.d("Code", "insertIntoTableByObject: 进入内部插入");
            Friend friend = (Friend)object;
            contentValues.put("AccountId",friend.getAccountId());
           //省略过多重复的contentValues添加方法,根据所需数据库自行添加
            contentValues.put("Temp4", friend.getTemp4());
        }else{
            Log.d("error", "insertIntoTableByObject: DBHelper");
        }
        //如果是别的表,请往后添加

        if(updateField !=null&& updateFieldValue !=null){
            contentValues.put(updateField, updateFieldValue);
        }
        //
        //事务处理
        try {
            //开始事务处理
            mWDB.beginTransaction();
            i = mWDB.update(tableName, contentValues, "" + field + "=?", new String[]{fieldValue});
            mWDB.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //结束事务处理
            mWDB.endTransaction();

        }
        return i;
    }

        通过使用实例执行sql语句方法:

        通过使用WDB实例对象执行sql语句方法

public void doSql(String sql) {
        mWDB.execSQL(sql);
    }

        第一次写博客,文章有需要改进的地方,还希望大家可以发挥主观能动性自己修改下啦

        今天分享就到这啦,觉得实用的别忘了收藏哇

标签:附可,SQLite,String,数据库,tableName,user,RDB,mWDB,null
From: https://blog.csdn.net/rawmeat/article/details/144226209

相关文章

  • PbootCMS如何确认服务器是否支持pdo_sqlite扩展?
    在使用PbootCMS时,如果遇到“未检测到您服务器环境的sqlite3数据库扩展”的提示,您可以选择将数据库配置连接驱动改为pdo_sqlite。为了确保这种方法可行,您需要先确认服务器是否支持pdo_sqlite扩展。以下是具体的操作步骤:创建phpinfo文件:在您的网站根目录下创建一个名为info.php......
  • Rust sqlx包访问sqlite数据库
    如果您正在钻研Rust并希望使用数据库,那么SQLx是一个极好的选择。在本教程中,我们将探索将SQLx与SQLite(一种轻量级嵌入式SQL数据库引擎)结合使用的基础知识。SQLxcrate是一个异步纯RustSQLcrate,具有编译时检查查询的功能。然而,它不是一个ORM。我们将了解如何创建SQLite数据......
  • PolarDB MySQL limit m,n Top K问题优化
    现有的limitm,n处理方式堆排序,topK算法归并排序时基于offset和limit做truncateSelf-sharpeninginputfilter算法假如有若干个sortedrun有序数组,则取第K大的元素(这个元素称为cutoffvalue)以及之前的值,其余的值都过滤掉,然后再用这个cutoffvalue值过滤其他sorte......
  • Redis 持久化方式 AOF RDB
    持久化方式AOF将每一个收到的写命令追加到AOF文件中,属于追加写。通俗的理解就是日志记录特性日志内容记录写命令,类似于mysqlbinlog的statement格式。每当有一个写命令过来时,就直接保存在AOF文件中重写机制为什么有重写机制:由于AOF持久化是Redis不断将写命令记录到AOF......
  • 活动报名!《国产开源数据库PolarDB&PG专家训练营》北京站
    2024年11月29日,由PolarDB社区联合PostgreSQL社区发起的《国产开源数据库PolarDB+PostgreSQL专家训练营》在北京站正式开课。PostgreSQL中文社区理事长及多位核心成员汇聚上地国际人才会客厅会议室,为大家带来为期一天的技术盛宴,和大家一起分享PolarDB和PostgreSQL数据库知识,探索......
  • c# sqlite "unable to open database file"错误
    我这个问题是开发环境正常,打安装包后运行报错,记录一下一、解决连接的问题App.config<connectionStrings><addname="sqliteConnection"connectionString="DataSource=|DataDirectory|\UpperMaterial.db;Pooling=true;FailIfMissing=false"providerName="System......
  • Redis学习:十大数据类型、RDB持久化
    Redis学习文章目录Redis学习1.Redis-10大数据类型2.Redis持久化1.Redis-10大数据类型数据类型是value的类型,key的类型都是String数据类型是value的类型,key的类型都是String数据类型是value的类型,key的类型都是String命令不区分大小写,但key是区分大小写的命......
  • 安装了sqlite3依赖,编译源码报No package 'sqlite3' found
    如果已经安装了SQLite3.44.0,但在运行./configure时仍然出现“Nopackage'sqlite3'found”的错误,这通常是因为pkg-config没有找到相应的SQLite开发文件(.pc文件)。可按照以下步骤检查和修复此问题:1.确保pkg-config已安装首先,确认系统上安装了pkg-config工具:sudoyuminstall......
  • Django替换sqlite默认数据库到mysql的一系列操作
    将这部分注释掉:DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',}} 并替换为:DATABASES={'default':{......
  • Pyqt5+SQLite
    通常在做业务逻辑时会遇到,如何在界面上对数据库信息进行操作的问题。这里我们选用SQLite,它是一种嵌入式数据库,以单个独立的文件形式存储数据,适用于Pyqt5的开发。下面做一个小案例,将数据库信息显示在界面中。1.创建数据库代码案例如下(创建一个用户信息表):conn=sqlite3.con......