🐳 《Android》 安卓开发教程 -本地数据库-LitePal

327 阅读4分钟

一、安卓本地数据:LitePal

LitePal 是一个 Android 平台上轻量级的 ORM(对象关系映射)框架,它使得数据库操作变得更加简单和高效。LitePal 库通过让开发者直接操作 Java 对象来简化了数据库的增、删、改、查(CRUD)操作,避免了传统的 SQL 语句的复杂性。LitePal 具有简洁的 API,易于集成和使用。

二、LitePal实战

1.添加依赖

在app/build.gradle文件中添加compile依赖如下:

dependencies {
    implementation 'org.litepal.guolindev:core:3.2.3'
}

2.在assets目录下创建litepal.xml配置文件

项目文件夹下New->Folder->Assets Folder创建相应的assets文件夹,然后在assets文件夹下创建一个名为litepal.xml的文件,编辑文件如下:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    
    <dbname value="resident" />// 数据库名称为resident,默认以 .db 结尾,如未以此结尾,则自动添加。

   
    <version value="14" />

   
    <list>
        <mapping class="com.imindbot.medicalinformation.data.db.User" />
        <mapping class="com.imindbot.medicalinformation.data.db.HealthCheckUpLite" />
        <mapping class="com.imindbot.medicalinformation.data.db.BLEDeviceTable"/>
        <mapping class="com.imindbot.medicalinformation.data.db.ResidentArchivesDB"/>
        <mapping class="com.imindbot.medicalinformation.data.db.HealthManageLite"/>
        <mapping class="com.imindbot.medicalinformation.data.db.ChildHealthCheckUpLite"/>
        <mapping class="com.imindbot.medicalinformation.data.db.ElderlySelfCareScoreDataLite"/>

    </list>

  

</litepal>

上面的version版本号的配置在每次数据库有更改时度必须+1,否则新的修改不会生效,我们可以这样理解,当我们新增了一个mapping,但是version没有+1的话,重新运行应用,发现value的值和之前一样,就会忽略< list >标签中配置的mapping,这样新加的数据库是不会创建的,除非我们卸载了重新安装,不然就必须设置version+1才会重新启动配置。

3.在Application中初始化

package com.imindbot.medicalinformation;

import android.app.Application;
import android.view.Gravity;

import com.hjq.toast.Toaster; // 引入 Toaster 库,用于显示 Toast 消息
import com.inuker.bluetooth.library.BluetoothContext; // 引入蓝牙库,用于初始化蓝牙上下文
import com.omron.lib.OMRONLib; // 引入 Omron 库,用于连接和操作 Omron 设备(目前未启用)
import com.tencent.bugly.crashreport.CrashReport; // 引入 Bugly 库,用于错误报告

import org.litepal.LitePal; // 引入 LitePal 库,用于数据库操作
import org.litepal.LitePalApplication; // 引入 LitePalApplication,LitePal 的基础应用类

public class App extends LitePalApplication {

    private int version; // 用于保存应用的版本号

    private static App _instance; // 单例模式保存应用实例

    // 获取应用实例
    public static Application getInstance() {
        return _instance;
    }

    // 应用创建时调用
    @Override
    public void onCreate() {
        super.onCreate();
        _instance = this; // 初始化应用实例

        BluetoothContext.set(this); // 设置蓝牙上下文

        // OMRONLib.init(this); // 初始化 Omron 库(目前注释掉,未启用)

        LitePal.initialize(this); // 初始化 LitePal 数据库框架

        // 初始化 Bugly 崩溃报告,传入 App ID 和调试模式
        CrashReport.initCrashReport(getApplicationContext(), "f683359909", false);

        Toaster.init(this); // 初始化 Toaster 库
        Toaster.setGravity(Gravity.BOTTOM); // 设置 Toast 显示的位置为底部

        try {
            // 获取应用版本号
            version = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
        } catch (Exception e) {
            // 如果获取版本号失败,则捕获异常
        }

    }
}

4.定义HealthCheckUpLite

package com.imindbot.medicalinformation.data.db;

import android.util.Log;

import com.google.gson.Gson;
import com.imindbot.medicalinformation.data.param.HealthCheckUpSaveParam;
import com.imindbot.medicalinformation.utils.GetTokenUtil;

import org.litepal.LitePal;
import org.litepal.annotation.Column;
import org.litepal.crud.LitePalSupport;

import java.util.List;

import lombok.Data;

/**
 * 体检表
 *
 */
@Data
public class HealthCheckUpLite extends LitePalSupport {

    @Column
    private long id;

    @Column
    private String cardNumber;

    /**
     * 是否同步到外网数据库 是:否
     *
     */
    @Column
    private String saveFlag;

    @Column
    private String paramJson;  // 存储 HealthCheckUpSaveParam 对象的 JSON 字符串

    @Column
    private String createTime;


    // 创建 Gson 实例,只需一次创建
    private static final Gson gson = new Gson();

    // 设置 param 时,将 HealthCheckUpSaveParam 转换为 JSON 字符串
    public void setParam(HealthCheckUpSaveParam param) {
        this.paramJson = gson.toJson(param);
    }

    // 获取 param 时,将 JSON 字符串转换回 HealthCheckUpSaveParam 对象
    public HealthCheckUpSaveParam getParam() {
        return gson.fromJson(this.paramJson, HealthCheckUpSaveParam.class);
    }

    /**
     * 根据身份证号和创建时间插入或更新记录
     * @param cardNumber 身份证号码
     * @param createTime 创建时间
     * @param param HealthCheckUpSaveParam 对象
     * @param saveFlag 是否同步外网数据库
     * @return 是否成功操作
     */
    public static boolean saveOrUpdateByCardAndCreateTime(String cardNumber, String createTime,
                                                          HealthCheckUpSaveParam param, String saveFlag) {
        // 查找是否已存在相同身份证号和创建时间的记录
        HealthCheckUpLite existingRecord = LitePal.where("cardNumber = ? and createTime = ?", cardNumber, createTime)
                .findFirst(HealthCheckUpLite.class);

        // 如果已存在,则更新该记录
        if (existingRecord != null) {
            existingRecord.setParam(param);
            existingRecord.setSaveFlag(saveFlag);
            existingRecord.save();  // 更新记录
            return true;  // 更新成功
        }

        // 如果不存在,则插入新记录
        HealthCheckUpLite newRecord = new HealthCheckUpLite();
        newRecord.setCardNumber(cardNumber);
        newRecord.setCreateTime(createTime);
        newRecord.setParam(param);
        newRecord.setSaveFlag(saveFlag);
        newRecord.save();  // 插入新记录
        return true;  // 插入成功
    }


    /**
     * 根据身份证号和创建时间查询体检记录
     *
     * @param cardNumber 身份证号码
     * @param createTime 创建时间
     * @return 匹配的 HealthCheckUpLite 记录,或者 null 如果没有找到
     */
    public static HealthCheckUpLite getHealthCheckUpByCardAndCreateTime(String cardNumber, String createTime) {
        // 检查传入的 cardNumber 和 createTime 是否为 null
        if (cardNumber == null || createTime == null) {
            Log.e(GetTokenUtil.COMMON_TAG, "cardNumber or createTime is null");
            return null;  // 或者可以抛出异常,根据需求决定
        }

        // 使用 LitePal 查询符合条件的 HealthCheckUpLite 记录
        List<HealthCheckUpLite> results = LitePal.where("cardNumber = ? and createTime = ?", cardNumber, createTime)
                .find(HealthCheckUpLite.class);

        // 如果找到匹配的记录,返回第一个结果
        if (results != null && !results.isEmpty()) {
            return results.get(0);  // 返回第一个匹配的结果
        }

        return null;  // 如果没有找到匹配的记录,返回 null
    }

    /**
     * 查询saveFlag为"否"且createTime不为空的体检记录
     *
     * @return 符合条件的 HealthCheckUpLite 记录列表
     */
    public static List<HealthCheckUpLite> getHealthCheckUpsBySaveFlagAndCreateTime() {
        // 使用LitePal的查询功能,查询符合条件的 HealthCheckUpLite 记录
        List<HealthCheckUpLite> results = LitePal.where("saveFlag = ? and createTime is not null", "否")
                .find(HealthCheckUpLite.class);
        return results;  // 返回符合条件的记录列表
    }

    /**
     * 删除所有体检记录
     *
     */
    public static void deleteAllHealthCheckUps() {
        LitePal.deleteAll(HealthCheckUpLite.class);
    }


}