一、安卓本地数据: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);
}
}