Android数据库框架-Archiver(LiteOrm)的使用

2023-10-24 01:58

本文主要是介绍Android数据库框架-Archiver(LiteOrm)的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:Android数据库框架-Archiver(LiteOrm)的使用



 在Android开发中,大家开发不同项目,不同的项目就不有不同需求。但是不管是什么项目都会涉及到数据存储。比如SharePreferences,SQLite,File等方式。但是我最近开发的项目是一个有IM的项目。所以需要用到SQLite,原因是这其中的数据并不是所有数据都是在后台拉取的。也有需要自己去创建表,和填充数据的功能。下面具体讲讲我在项目中使用的数据库和所遇到的数据库问题。

      LiteOrm: LiteOrm是一个速度快、小巧却强大的android ORM框架类库,LiteOrm让你一行代码实现数据库的增删改查操作,以及实体关系的持久化和自动映射。

  • 轻量,专注,性能优先,线程无关,专注数据及其关系(关系是重点)存储和读取。 
  • 不需要工具辅助,实体不需要无参构造,不需要繁多注解,约定大约配置,一切多余的,都不需要。
  • 使用极致简约:db.save(u); db.delete(u); db.deleteAll(U.class);

    开源项目地址:https://github.com/litesuits/android-lite-orm
    作者个人主页:http://litesuits.com/

    我为什么选择用LiteOrm的原因:

  •       因为我开发的项目是一个IM的项目,当然要允许账号切换当账号切换之后上一个用户对应的数据和下一个用户对应的数据怎么区分?这是一个细节上的问题。所以我采用的QQ的做法,一个用户对应一个数据库。有些库写的也不错,可是考虑的不周全,一个用户对应一个数据库是最好的,但是有些库没有考虑进去,但是LiteOrm可以自定义数据库名字已经目录。
  •      在当我使用其他的库的时候,报错了,尼玛我研究看瞎都没有看出到底是什么错,没有一个准确的提示告诉我到底是什么地方错误。比如我其中有一个字段是from,这个是数据库关键字,总是创建不成功,但是那个库又报一些看不懂错,根本没有说倒是是哪错了。但是在我使用LiteOrm的时候哪里错了会明确的告诉你。
  •      因为LiteOrm体积小,专一,一个库只做一件事,是什么库就做什么事情,有些库什么功能都有,又是HTTP请求,又是下载图片,但是我只需要用到其中一个模块而已。


    1、创建数据库:


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
      * 创建数据库细节 :
      * 细节一:每次启动都会调用这个方法,是否会重复创建,或者说怎么判断这个数据库已经存在。
      * 回答:尽在第一次创建,开发这不用关心存在否。
      *
      * 细节二:如果指定目录创建在SD卡上,卸载APP之后,重新安装,以前的创建的数据库还存在
      * 回答:如果不想这样,就不要指定创建在SD卡上面,默认创建就在APP里。卸载后数据库就不存在了
      *
      * 细节三:创建数据库有两种模式,第一种是单一操作没有级联关系的,第二种是级联操作。
      * 创建单一操作模式:LiteOrm.newSingleInstance(_activity, DB_NAME);
      * 创建级联操作模式:LiteOrm.newCascadeInstance(_activity, DB_NAME);
      */
     public static void createDb(Context _activity,Object userId){
          //DB_NAME = Environment.getExternalStorageDirectory().getAbsolutePath()+"/pinme.db";
         DB_NAME = "pinme_" + userId.toString() + ".db" ;
             liteOrm = LiteOrm.newCascadeInstance(_activity, DB_NAME);
             liteOrm.setDebugged( true );
     }


  解释一下创建数据库Cascade 和 Single 两种模式的的区别:

    LiteOrm是基类,是基础。有两个孩子实现:Cascade 和 Single。

    如果使用Single,效率最高,只保存当前Model,简单的首选。

    如果使用Cascade实例,将会无限级联操作(不会死循环),将所有与这个Model相关的实体、关系都保存下来。 重点介绍下Cascade,举个例子,一个学校有10个学院(一对多),一个学院10个专业,一个专业10个班级,一个班级10个老师,一个老师10个学生(多对多关系)。只要调用cascade.save( school ); 那么这个学校,以及10 0000个学生 ,和他们的关系,都保存下来了。 删除也一样,都删了

 2、如何创建表:都说了ORM嘛,所以不需要像android原生的代码那样去写SQL语句去创建。只需要如下创建实体类


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BaseModel implements Serializable {
     // 设置为主键,自增
     @PrimaryKey (AssignType.AUTO_INCREMENT)
     public int id;
     public int getId() {
         return id;
     }
     public void setId( int id) {
         this .id = id;
     }
}

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Table ( "Conversation" ) //指定表名,可任意写
public class Conversation extends BaseModel {
     
     public static final String MESSAGEID = "messageId" ;
     public static final String ISVISIBILITY = "isVisibility" ;
         //这里又是一个实体类的LIST,可以理解为另外一张表。这么写,就代表 Conversation表和User表是 一对多关系
          <span></span> private List<User> user;
     private String nickName;
     private String headImgUrl;
     private String content;
     private String sendDate;
     private int msgType;
     private int subType;
     private int messageId; // 用于话题聊天的id,和私聊的 Userid
     private int senderUserId;
     private Boolean isVisibility = true ;
     private int messageType;
     private int messageNum;
     
     //  以下省略一堆 get和set方法
}


 问题来了:现在实体类创建了,那什么时候创建表,如何创建表,在哪里写创建表的代码 ?

   其实不需要去刻意的去写创建表的代码,当我们把 Conversation 对象填充数据后 使用 liteOrm.save(Conversation );即可,会自动创建Conversation 


  下面是我自己根据我自己的需求封装的一个帮助类

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public class LiteOrmDBUtil {
     
     public static String DB_NAME;
     public static LiteOrm liteOrm;
     
     public static void createDb(Context _activity,Object userId){
         DB_NAME = "pinme_" + userId.toString() + ".db" ;
         liteOrm = LiteOrm.newCascadeInstance(_activity, DB_NAME);
         liteOrm.setDebugged( true );
     }
     
     
     public static LiteOrm getLiteOrm(){
         return liteOrm;
     }
     
     /**
      * 插入一条记录
      * @param t
      */
     public static <T> void insert(T t){
         liteOrm.save(t);
     }
     
     /**
      * 插入所有记录
      * @param list
      */
     public static <T> void insertAll(List<T> list){
         liteOrm.save(list);
     }
     
     /**
      * 查询所有
      * @param cla
      * @return
      */
     public static <T> List<T> getQueryAll(Class<T> cla){
         return liteOrm.query(cla);
     }
     
     /**
      * 查询  某字段 等于 Value的值
      * @param cla
      * @param field
      * @param value
      * @return
      */
     public static <T> List<T> getQueryByWhere(Class<T> cla,String field,String [] value){
         return liteOrm.<T>query( new QueryBuilder(cla).where(field + "=?" , value));
     }
     
     /**
      * 查询  某字段 等于 Value的值  可以指定从1-20,就是分页
      * @param cla
      * @param field
      * @param value
      * @param start
      * @param length
      * @return
      */
     public static <T> List<T> getQueryByWhereLength(Class<T> cla,String field,String [] value, int start, int length){
         return liteOrm.<T>query( new QueryBuilder(cla).where(field + "=?" , value).limit(start, length));
     }
     /**
      * 删除所有 某字段等于 Vlaue的值
      * @param cla
      * @param field
      * @param value
      */
     public static <T> void deleteWhere(Class<T> cla,String field,String [] value){
         liteOrm.delete(cla, WhereBuilder.create().where(field + "=?" , value));
     }
     
     /**
      * 删除所有
      * @param cla
      */
     public static <T> void deleteAll(Class<T> cla){
         liteOrm.deleteAll(cla);
     }
     
     /**
      * 仅在以存在时更新
      * @param t
      */
     public static <T> void update(T t){
         liteOrm.update(t,ConflictAlgorithm.Replace);
     }
     
     
     public static <T> void updateALL(List<T> list){
         liteOrm.update(list);
     }
     
     
     public static void Text(){
         
         //我们把这个对象当做以填充数据的后的对象
         Conversation mConversation = new Conversation();
         
         List<Conversation> list = new ArrayList<Conversation>();
         for ( int i = 0 ; i < 10 ; i++) {
             list.add(mConversation);
         }
         
         
         //1、插入单条数据
         LiteOrmDBUtil.insert(mConversation);
         
         //2、插入多条数据
         LiteOrmDBUtil.insertAll(list);
         
         //3、查询Conversation表中所有记录
         List<Conversation> list = LiteOrmDBUtil.getQueryAll(Conversation. class );
         
         //4、查询Conversation表中 isVisibility 字段 等于 true 的记录
         List<Conversation> list =  LiteOrmDBUtil.getQueryByWhere(Conversation. class , Conversation.ISVISIBILITY, new String[]{ "true" });
         
         //5、查询Conversation表中 isVisibility 字段 等于 true 的记录,并且只取20条 
         List<Conversation> list =  LiteOrmDBUtil.getQueryByWhereLength(Conversation. class , Conversation.ISVISIBILITY, new String[]{ "true" }, 0 , 20 );
         
         //6、删除Conversation表中 isVisibility 字段 等于 true 的记录
         LiteOrmDBUtil.deleteWhere(Conversation. class ,Conversation.ISVISIBILITY , new String[]{ "true" });
         
         //7、删除所有
         LiteOrmDBUtil.deleteAll(Conversation. class );
         
         
     }
}

这篇关于Android数据库框架-Archiver(LiteOrm)的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271942

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后