说明:个人直接项目测试类写博客,有个别地方删除,就不特别自个创建项目简化说明使用,可以仅仅看大概主要实现功能即可。

1、初始化(工程目录assets下创建litepal.xml文件)

litepal.xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<litepal><!--Define the database name of your application.By default each database name should be end with .db.If you didn't name your database end with .db,LitePal would plus the suffix automaticly for you.For example:<dbname value="demo" ></dbname>数据库文件名--><dbname value="test" /><!--Define the version of your database. Each time you wantto upgrade your database, the version tag would helps.Modify the models you defined in the mapping tag, and justmake the version value plus one, the upgrade of databasewill be processed automaticly without concern.For example:<version value="1" ></version>数据库版本号:注意,修改table表参数或者增加table表都需要在此修改叠加版本号--><version value="1" /><!--Define your models in the list with mapping tag, LitePal willcreate tables for each mapping class. The supported fieldsdefined in models will be mapped into columns.For example:<list><mapping class="com.test.model.Reader"></mapping><mapping class="com.test.model.Magazine"></mapping></list>数据库table表--><list><mapping class="com.example.myapplication.dao.WeiTingTable" /><mapping class="com.example.myapplication.dao.WeiTingRoadInfo" /></list><!--Define where the .db file should be. "internal" means the .db filewill be stored in the database folder of internal storage which noone can access. "external" means the .db file will be stored in thepath to the directory on the primary external storage device wherethe application can place persistent files it owns which everyonecan access. "internal" will act as default.For example:<storage value="external"></storage>数据库存放目录:工程目录下/database下--><storage value="external" />
</litepal>

2、Activity onCreate()初始化LitePal

@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dao);LitePal.initialize(this);}

3、关联表bean

package com.example.myapplication.dao;import android.util.Log;import com.orhanobut.logger.Logger;import org.litepal.LitePal;
import org.litepal.crud.LitePalSupport;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** 表结构:一对多关系*/
public class WeiTingRoadInfo extends LitePalSupport {private String adCode;private String wholeRoadCode;private String wholeRoadName;private String partRoadCode;private String partRoadName;/*** 提供子表获取其id** @return*/public long getId() {return getBaseObjId();}/*** 从数据库获取子表,仅供查询不可用于操作添加更新保存子表功能(操作使用getWeiTingTableList())** @return*/public List<WeiTingTable> getWeiTingTablesFromDb() {String linkId = this.getClass().getSimpleName().toLowerCase();// 对应子表id为:weitingtable_idreturn LitePal.where(linkId + "_id=?", String.valueOf(getBaseObjId())).find(WeiTingTable.class);}/*** 用于新增和更新子表** @return*/public List<WeiTingTable> getWeiTingTableList() {return weiTingTableList;}private List<WeiTingTable> weiTingTableList = new ArrayList<>();public String getAdCode() {return adCode == null ? "" : adCode;}public void setAdCode(String adCode) {this.adCode = adCode;}public String getWholeRoadCode() {return wholeRoadCode == null ? "" : wholeRoadCode;}public void setWholeRoadCode(String wholeRoadCode) {this.wholeRoadCode = wholeRoadCode;}public String getWholeRoadName() {return wholeRoadName == null ? "" : wholeRoadName;}public void setWholeRoadName(String wholeRoadName) {this.wholeRoadName = wholeRoadName;}public String getPartRoadCode() {return partRoadCode == null ? "" : partRoadCode;}public void setPartRoadCode(String partRoadCode) {this.partRoadCode = partRoadCode;}public String getPartRoadName() {return partRoadName == null ? "" : partRoadName;}public void setPartRoadName(String partRoadName) {this.partRoadName = partRoadName;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;WeiTingRoadInfo that = (WeiTingRoadInfo) o;return adCode.equals(that.adCode) &&wholeRoadCode.equals(that.wholeRoadCode) &&wholeRoadName.equals(that.wholeRoadName) &&partRoadCode.equals(that.partRoadCode) &&partRoadName.equals(that.partRoadName);}@Overridepublic int hashCode() {return Objects.hash(adCode, wholeRoadCode, wholeRoadName, partRoadCode, partRoadName);}@Overridepublic String toString() {return "WeiTingRoadInfo{" +"adCode='" + adCode + '\'' +", wholeRoadCode='" + wholeRoadCode + '\'' +", wholeRoadName='" + wholeRoadName + '\'' +", partRoadCode='" + partRoadCode + '\'' +", partRoadName='" + partRoadName + '\'' +'}';}@Overridepublic int delete() {// 将子表同步删除List<WeiTingTable> weiTingTables = getWeiTingTablesFromDb();for (WeiTingTable weiTingTable : weiTingTables) {weiTingTable.delete();}return super.delete();}public synchronized boolean saveToFirst() {if (LitePal.findLast(this.getClass()).equals(this)) {Log.e("DaoActivityLog", "已是最新位置的数据,不做刷新缓存处理。");Logger.e("已是最新位置的数据,不做刷新缓存处理。");return true;}Log.e("DaoActivityLog", "不是最新位置的数据,需要刷新缓存处理。");List<WeiTingTable> weiTingTables = getWeiTingTablesFromDb();List<WeiTingTable> newWeiTingTables = copyList(weiTingTables);if (newWeiTingTables != null) {// 避免一些拷贝异常情况清理旧的缓存数据// 拷贝全部数据正常saveStuTables(newWeiTingTables);} else {Logger.e("拷贝旧数据失败,不做刷新缓存处理。");return false;}return save();// 重新缓存}private void saveStuTables(List<WeiTingTable> weiTingTables) {delete();// 删除了子表for (WeiTingTable weiTingTable : weiTingTables) {weiTingTable.setWeiTingRoadInfo(this);weiTingTable.save();// 重新缓存子表getWeiTingTableList().add(weiTingTable);// 重新添加子表}}private List<WeiTingTable> copyList(List<WeiTingTable> weiTingTables) {List<WeiTingTable> newWeiTingTables = new ArrayList<>();for (WeiTingTable weiTingTable : weiTingTables) {WeiTingTable clone = (WeiTingTable) copy(weiTingTable);if (clone == null) return null;clone.setWeiTingRoadInfo(this);newWeiTingTables.add(clone);}return newWeiTingTables;}/*** 深拷贝** @param old* @return*/private Object copy(Object old) {Object clazz;try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(old);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);clazz = ois.readObject();} catch (Exception e) {Logger.e(e, "copy fail");return null;}return clazz;}}

子表类:

package com.example.myapplication.dao;import org.litepal.LitePal;
import org.litepal.annotation.Column;
import org.litepal.crud.LitePalSupport;import java.io.Serializable;/*** 表结构:多对一*/
public class WeiTingTable extends LitePalSupport implements Serializable {/*** 缓存对应的母表id,便于查询关联表*/private long road_id;private String hphm;private String hpzl;private WeiTingRoadInfo weiTingRoadInfo;public String getHphm() {return hphm == null ? "" : hphm;}public void setHphm(String hphm) {this.hphm = hphm;}public String getHpzl() {return hpzl == null ? "" : hpzl;}public void setHpzl(String hpzl) {this.hpzl = hpzl;}public String getWei_ting_id() {return wei_ting_id == null ? "" : wei_ting_id;}public void setWei_ting_id(String wei_ting_id) {this.wei_ting_id = wei_ting_id;}public void setWeiTingRoadInfo(WeiTingRoadInfo weiTingRoadInfo) {if (weiTingRoadInfo != null) {weiTingRoadInfo.getWeiTingTableList().add(this);weiTingRoadInfo.save();road_id = weiTingRoadInfo.getId();// 前提是WeiTingRoadInfo 先save才有对应id,否则0this.weiTingRoadInfo = weiTingRoadInfo;}}/*** 关联表获取需要查询对应子表的id获取** @return*/public WeiTingRoadInfo getWeiTingRoadInfo() {if (weiTingRoadInfo != null) return weiTingRoadInfo;// 通过缓存id获取对应关联表return LitePal.find(WeiTingRoadInfo.class, road_id);}}

4、DaoActivity具体实现

package com.example.myapplication;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;import com.example.myapplication.dao.WeiTingRoadInfo;
import com.example.myapplication.dao.WeiTingTable;import org.litepal.LitePal;import java.util.List;public class DaoActivity extends AppCompatActivity {private static final String TAG = DaoActivity.class.getSimpleName() + "Log";@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dao);LitePal.initialize(this);}private int mCount;public void save(View view) {if (mCount < 10) {Log.e(TAG, "第一次缓存");++mCount;WeiTingRoadInfo weiTingRoadInfo = new WeiTingRoadInfo();weiTingRoadInfo.setAdCode("weiTingRoadInfoAdCode" + mCount);weiTingRoadInfo.setPartRoadName("weiTingPartRoadName" + mCount);weiTingRoadInfo.setPartRoadCode("weiTingRoadInfoPartRoadCode" + mCount);weiTingRoadInfo.setWholeRoadCode("weiTingRoadInfoWholeRoadCode" + mCount);weiTingRoadInfo.setWholeRoadName("weiTingRoadInfoWholeRoadName" + mCount);boolean save = weiTingRoadInfo.save();Log.e(TAG, "weiTingRoadInfo1-1: " + save + " - " + weiTingRoadInfo.getAdCode());for (int i = mCount - 1; i < mCount + 10; ++i) {WeiTingTable weiTingTable = new WeiTingTable();weiTingTable.setHphm("weiTingTableHphm" + i);weiTingTable.setHpzl("weiTingTableHpzl" + i);weiTingTable.setWeiTingRoadInfo(weiTingRoadInfo);weiTingTable.save();
//                weiTingRoadInfo.getWeiTingTableList().add(weiTingTable);}
//            boolean save = weiTingRoadInfo.save();
//            Log.e(TAG, "weiTingRoadInfo1-2: " + save + " - " + weiTingRoadInfo.getAdCode());mCount += 10;} else if (mCount < 20) {Log.e(TAG, "第二次缓存");++mCount;WeiTingRoadInfo weiTingRoadInfo = new WeiTingRoadInfo();weiTingRoadInfo.setAdCode("weiTingRoadInfoAdCode" + mCount);weiTingRoadInfo.setPartRoadName("weiTingPartRoadName" + mCount);weiTingRoadInfo.setPartRoadCode("weiTingRoadInfoPartRoadCode" + mCount);weiTingRoadInfo.setWholeRoadCode("weiTingRoadInfoWholeRoadCode" + mCount);weiTingRoadInfo.setWholeRoadName("weiTingRoadInfoWholeRoadName" + mCount);boolean save = weiTingRoadInfo.save();
//            Log.e(TAG, "weiTingRoadInfo2-1: " + save + " - " + weiTingRoadInfo.getAdCode());for (int i = mCount - 1; i < mCount + 10; ++i) {WeiTingTable weiTingTable = new WeiTingTable();weiTingTable.setHphm("value" + i);weiTingTable.setHpzl("value" + i);weiTingTable.setWeiTingRoadInfo(weiTingRoadInfo);weiTingTable.save();
//                weiTingRoadInfo.getWeiTingTableList().add(weiTingTable);}
//            boolean save = weiTingRoadInfo.save();
//            Log.e(TAG, "weiTingRoadInfo2-2: " + save + " - " + weiTingRoadInfo.getAdCode());mCount += 10;} else {Log.e(TAG, "之后缓存");++mCount;WeiTingRoadInfo weiTingRoadInfo = new WeiTingRoadInfo();weiTingRoadInfo.setAdCode("weiTingRoadInfoAdCode" + mCount);weiTingRoadInfo.setPartRoadName("weiTingPartRoadName" + mCount);weiTingRoadInfo.setPartRoadCode("weiTingRoadInfoPartRoadCode" + mCount);weiTingRoadInfo.setWholeRoadCode("weiTingRoadInfoWholeRoadCode" + mCount);weiTingRoadInfo.setWholeRoadName("weiTingRoadInfoWholeRoadName" + mCount);boolean save = weiTingRoadInfo.save();Log.e(TAG, "weiTingRoadInfo3-1: " + save + " - " + weiTingRoadInfo.getAdCode());int count = 0;for (int i = mCount - 1; i < mCount + 10; ++i) {WeiTingTable weiTingTable = new WeiTingTable();weiTingTable.setHphm("value" + i);weiTingTable.setHpzl("value" + i);if (i % 2 == 0) {weiTingTable.setMidPicPath("valueMidPicPath" + i);}weiTingTable.setWeiTingRoadInfo(weiTingRoadInfo);weiTingTable.save();
//                weiTingRoadInfo.getWeiTingTableList().add(weiTingTable);count = i;}
//            save = weiTingRoadInfo.save();
//            Log.e(TAG, "weiTingRoadInfo3-2: " + save + " - " + weiTingRoadInfo.getAdCode());mCount += count;}Log.e(TAG, "mCount: " + mCount);}public void get(View view) {List<WeiTingRoadInfo> weiTingRoadInfos = LitePal.findAll(WeiTingRoadInfo.class);for (WeiTingRoadInfo weiTingRoadInfo : weiTingRoadInfos) {List<WeiTingTable> weiTingTables = weiTingRoadInfo.getWeiTingTablesFromDb();for (WeiTingTable weiTingTable : weiTingTables) {Log.e(TAG, "weiTingTable: " + weiTingTable.getHphm());Log.e(TAG, "weiTingRoadInfo: " + weiTingRoadInfo.getAdCode());}}}public void update(View view) {WeiTingRoadInfo first;if (System.currentTimeMillis() % 2 == 0) {first = LitePal.findLast(WeiTingRoadInfo.class);} else {first = LitePal.findFirst(WeiTingRoadInfo.class);}Log.e(TAG, "first: " + first.getAdCode());first.saveToFirst();WeiTingRoadInfo last = LitePal.findLast(WeiTingRoadInfo.class);Log.e(TAG, "last: " + last.getAdCode());for (WeiTingTable weiTingTable : last.getWeiTingTablesFromDb()) {Log.e(TAG, "last weiTingTable: " + weiTingTable.getHphm());}}public void delete(View view) {WeiTingRoadInfo weiTingRoadInfo = LitePal.findFirst(WeiTingRoadInfo.class);weiTingRoadInfo.delete();}public void deleteAll(View view) {LitePal.deleteAll(WeiTingRoadInfo.class);}public void add(View view) {WeiTingRoadInfo weiTingRoadInfo = LitePal.findFirst(WeiTingRoadInfo.class);WeiTingTable weiTingTable = new WeiTingTable();weiTingTable.setHphm("000000");weiTingTable.setWeiTingRoadInfo(weiTingRoadInfo);weiTingTable.save();}public void updateStu(View view) {WeiTingRoadInfo weiTingRoadInfo = LitePal.findFirst(WeiTingRoadInfo.class);List<WeiTingTable> weiTingTableList = weiTingRoadInfo.getWeiTingTablesFromDb();WeiTingTable weiTingTable = weiTingTableList.get(0);weiTingTable.setHphm("update00000");weiTingTable.setWeiTingRoadInfo(weiTingRoadInfo);weiTingTable.save();}public void deleteStu(View view) {
//        WeiTingRoadInfo weiTingRoadInfo = LitePal.findFirst(WeiTingRoadInfo.class);
//        List<WeiTingTable> weiTingTableList = weiTingRoadInfo.getWeiTingTablesFromDb();
//        WeiTingTable weiTingTable = weiTingTableList.get(0);
//        weiTingTable.delete();deleteWeiTingInvalidData();}public void getStu(View view) {List<WeiTingTable> all = LitePal.findAll(WeiTingTable.class);for (WeiTingTable weiTingTable : all) {Log.e(TAG, "weiTingTable: " + weiTingTable.getHphm());}}public void getParent(View view) {WeiTingTable first = LitePal.findFirst(WeiTingTable.class);WeiTingRoadInfo weiTingRoadInfo = first.getWeiTingRoadInfo();Log.e(TAG, "weiTingRoadInfo: " + weiTingRoadInfo.getAdCode());}/*** 清除无效缓存*/private void deleteWeiTingInvalidData() {List<WeiTingTable> all = LitePal.findAll(WeiTingTable.class);int count = 0;for (WeiTingTable weiTingTable : all) {if (TextUtils.isEmpty(weiTingTable.getMidPicPath())) {weiTingTable.delete();++count;}}Log.e(TAG, "count: " + count);}
}

不清楚地方可留言,有时间回复。

LitePal 数据库基本操作和关联表方式(一对多)(原创)相关推荐

  1. mysql tb_Mysql数据库分库和分表方式

    原标题:Mysql数据库分库和分表方式 本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1 ...

  2. LitePal 数据库基本操作

    LitePal官网 1.导入依赖 //LitePal数据库 Kotlin版--java版看官网 implementation 'org.litepal.android:kotlin:3.0.0' 2. ...

  3. MySQL数据库基本操作总结(不断更新中......)

    1.登录mysql数据库: mysql -u root -p 输入密码 2.登出mysql数据库: \q 3.关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系 ...

  4. 6、数据库表的关系、Java对象的关系、关联查询(一对多)、延迟加载访问

    文章目录 关联查询.多表 数据库表关系 Java对象之间的关系 前提条件 一对多 单向关联 延迟加载 双向关联 延迟加载 延迟加载中传递多个参数 关联查询.多表 数据库表关系 表->约束(主键约 ...

  5. 数据库关联映射建表图示(一对多、多对多)

    数据库关联映射建表图示(一对多.多对多) ~总结一下数据库的 一对多.多对一.一对一.多对多 关系 以及对应的建表方式~ 关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: ...

  6. Mysql数据库基本操作(七)多表查询-子查询,表自身关联查询

    多表查询还有前面的两块内容--内连接查询,外连接查询,希望看到这篇博客的朋友先去看看我的"Mysql数据库"专栏中Mysql数据库基本操作(六)多表查询-内连接,外连接这一章博客, ...

  7. 【MySQL】数据库基本操作、表的操作

    一.数据库 1.什么是数据库 2.数据库基本操作 2.1.显示数据库 2.2. 创建数据库 2.3.选中数据库 2.4.删除数据库 3.数据库分类 4.MySQL 安装 二.数据表的使用 1. 常用数 ...

  8. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题

    文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...

  9. mysql表关联查询都有什么方式_所有关联表查询方式

    前言 想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是 虫虫:为了方便小白 虫虫把关联表的查询方式总结了 关联查询种类 ...

最新文章

  1. node-webki NATIVE UI API概览
  2. php截取字符串后编码不对,php截取字符串出现中文乱码问题的解决
  3. 如何在前端中使用protobuf(vue篇)
  4. 特征选择的基本方法概述
  5. bootstrap treeview 多级联动check/uncheck
  6. QQ三国推举孝廉答题工具使用说明
  7. 9.22 英语单词回顾
  8. [推荐书籍]12本程序员必备书籍
  9. ubuntu从tty终端模式返回到图形桌面
  10. vscode ssh: Resolver error: Error: XHR failedscode错误
  11. RTT and RTO
  12. 用JS解决那些有趣的数学题!
  13. 如何用计算机扫描图片变成文字,怎么扫描图片上的文字-华为手机黑科技"文字扫描仪",3秒就能将纸质文档转成电子档,牛...
  14. Java、JSP汽车零件销售管理系统的设计与实现
  15. JVM性能调优4_JVM的执行子系统__享学课堂
  16. Task 5 Cypher 介绍及Neo4j 图数据库查询
  17. 安装oracle11g数据库问题,linux 6.3安装Oracle11.2 R2数据库问题汇总
  18. MDK537添加ARMCC编译器(Missing: Compiler Version 5的解决办法)
  19. [转载]JS浏览器兼容性问题
  20. 一个运动控制系统的实例

热门文章

  1. 将Spine动画导入unity
  2. 海南大学施超杰计算机与科学,HAAI新闻丨20支精英队伍!2019高校计算机大赛人工智能创意赛(海南赛区)进入决赛阶段,29日总决赛!...
  3. 数字阅读正成移动互联网趋势
  4. bootstrap-table 一直显示“正在努力地加载数据中,请稍候”的问题
  5. 普元 EOS Platform 7.6适配人大金仓v8
  6. matlab基础教程实验报告,Matlab基础实验报告.doc
  7. linux 中了挖矿病毒
  8. windos10本地安装git工具并使用
  9. HALCON学习-下载、安装
  10. android去除root,RE管理器root权限彻底清除教程[图]