GreenDao insertOrReplace和save的区别

GreenDao insertOrReplace和save的区别,第1张

你好,很高兴为你解答

关于GreenDao insertOrReplace和save的区别:

insertOrReplace : 传入的对象在数据库中,有则更新无则插入。推荐同步数据库时使用该方法。

save 类似于insertOrReplace,区别在于save会判断传入对象的key,有key的对象执行更新,无key的执行插入。当对象有key但并不在数据库时会执行失败适用于保存本地列表。

适用场景

只有本地数据库,且key默认由数据库生成。直接使用save就好

插入的数据有key,其实这种情况通常是同步线上数据到本地数据库时的情况,因为直接使用了数据库的key,所以不能使用save,必须使用insertOrReplace。

结论

在确保插入数据有key时必须存在于数据库的情况下,适用save更高效。其他情况一律适用insertOrReplace

不足之处还望大神指正

可以参考如下内容:

目前android开发刚学习了一个多月,最近开始研究三方开源框架的用法。了解android开发的人应该都会知道,android的数据库开发主要用到sqlite(如果这点你不清楚,那这篇文章就直接pass吧)。greenDAO应该算是当前最火的数据库开源框架了吧,它是一个移动开发的ORM(object / relational mapping)框架,至于ORM是什么,可以百度之,本人理解也不是很深,大概意思就是为懒人设计的能够将对象和关系以映射的方式表达出来。greenDAO就是如此:

greenDAO will do the word for you: it maps Java objects to datebase tables(often called ORM) 这样开发人员就可以吧精力集中在软件开发上,减轻了"wrting sql and parsing query results" 等等这些"quite tedious tasks"

总之,一句话,greenDAO就是实现Java对象和SQLite Datebase的一个媒介人,简化了SQLite的 *** 作。

注:官方网站>

greenDAO是一个开源的Android ORM,使SQLite数据库的开发再次变得有趣。 它减轻了开发人员处理底层的数据库需求,同时节省开发时间。 SQLite是一个很不错的关系型数据库。 尽管如此,编写SQL和解析查询结果仍然是相当乏味和耗时的任务。 greenDAO通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”)来解决这些问题。 这样,您可以使用简单的面向对象的API来存储,更新,删除和查询Java对象。

特性

最高性能(可能是Android中最快的ORM); 我们的benchmarks 也是开源的

涵盖关系和连接且易用的强大API

最小的内存开销

迷你开源库(<100KB),降低工程构建时间同时避免65k方法限制

数据库加密:greenDAO支持SQLCipher以保证用户的数据安全

强大的社区:超过5000 GitHub星星表明我们拥有一个强大而活跃的社区

开始使用

入门

本教程将引导你完成一个简单的greenDAO示例项目DaoExample。 克隆代码并运行它,或者直接在GitHub上查看文件。

DaoExample是一个简单地用来记笔记的Android应用程序。 你可以通过键入一些文本来添加新笔记,并通过点击现有笔记删除笔记。

1 Note实体和DAO类

一起看下代码:在src文件夹中,你会发现一个实体类Notejava。 它被持久化到数据库并包含Note的所有数据,如id,注释文本和创建日期。通常,实体是在数据库中持久化的类(例如,一个对象的一行)。 实体包含映射到数据库列的属性。

现在开始编译工程,例如在Android Studio中使用“Build> Make project”。 这将触发greenDAO来生成DAO类,例如NoteDaojava,这将帮助我们向数据库添加笔记。

2 插入和删除笔记

要学习如何添加一些笔记,请看一下NoteActivity类。 首先,我们必须为我们的Note类准备一个DAO对象,我们在onCreate()中做:

greenDAO是一个开源框架。

这个官网页面

官网下载它的架包位置

下载jar包的页面

greendao-137jar

greendao-generator-131jar

项目源码页面

可以下载整个源码(这个不用添加到项目)

还需要一个jar

freemarker2320jar

这个是java通过模板生成类时用到的包

现在开始展示例子工程

生成类的工程为普通的java工程

这个部分的代码不能放android工程里面,不然会起冲突。

这是生成实体类的java类的结构图

package comexamplegreendao_testDB_Initialize;

import javaioIOException;

import degreenrobotdaogeneratorDaoGenerator;import degreenrobotdaogeneratorEntity;import degreenrobotdaogeneratorSchema;

/ 生产类执行程序(建表和生成关系类) @author aboutych /public class Initialize_Entity_main {

public static void main(String[] args) throws IOException, Exception {

Schema schema = new Schema(3, "comexamplegreendao_testEntity");

add_db_user(schema);

new DaoGenerator()generateAll(schema, "/GreenDAO_test/src-gen");

}

/ 用户信息 / private static void add_db_user(Schema schema) {

//自动生成有个特点,表名必须是大写开头,不然生成的实体类调用会出问题。

Entity db_user = schemaaddEntity("Db_user"); db_useraddIdProperty()autoincrement(); db_useraddStringProperty("user_id")primaryKey();// 用户编号 db_useraddStringProperty("user_name");// 姓名 db_useraddStringProperty("loginName");// 登陆名 db_useraddStringProperty("pwd");// 密码 db_useraddStringProperty("qq");// QQ号 db_useraddStringProperty("wechat");// 微信号 db_useraddStringProperty("phone");// 手机号 db_useraddStringProperty("deviceno");// 设备号 db_useraddStringProperty("type");// 用户类型(安全员/学生管理员/家长) db_useraddStringProperty("school");// 学生管理员对应学校编号 db_useraddStringProperty("version");// 应用版本

}

}

现在讲解代码具体意思

Schema schema = new Schema(3, "comexamplegreendao_testEntity");

//设置sqllite数据库的版本和生成文件放到那个包里面

//第一个参数输入sqlite数据库,第二个参数输入生成类要存放的路径

add_db_user(schema);

//数据库表方法

new DaoGenerator()generateAll(schema, "/GreenDAO_test/src-gen");

//调用框架实体类生成方法

//第一个参数输入这个保存有数据库版本信息和类生成位置的架构类

//第二个参数输入实体类生成的项目位置("/GreenDAO_test/src-gen相对于你的工作空间项目的位置。src-gen是你资源文件夹的名字)

//生成类会出现在你设置的文字 (例如:截图)

关于greenDao 的排序 , 常用的有三个方法

1orderAsc(Propertyproperties)

很简单这是个正序排序,传入参数即可。SQL语句中排序orderby的时候是不指定正反序,默认是正序。 但是无论是greenDao还是SQL语句进行排序,这里都有一个坑,敲黑板!!!就是这个需要的这个参数properties的类型,千万不要是String!!! 楼主在这坑爬了半天,简单举例如果你这个参数是string类型的,那么你就会发现它是一位一位取出来进行排序的,就是这样的 1,10,11,122,20,21,22而不是你想要的123456

2orderDesc(Property properties)

这个是倒叙没什么好说的

3orderRaw(String rawOrder)

这个就厉害了,举个例子,你要做个考试系统的随机练习功能,但是greenDao并没有像SQL语句那样提供random方法,这时候如果又用回SQL语句建立规则然后游标cu'rsor查询,那我们为什么费劲巴拉的用greenDao呢,其实 greenDao是可以结合SQL语句 进行食用的,安全无公害还嘎嘣脆笑。。。这里用这个方法就可以轻松实现,点出来写入语句即可。( 注:这里输出list的时候不要用listLazyUncached()!!! )

一下载GreenDao

要使用肯定要先下载他的软件包了,官网上有它的连接,对于marven和gradle环境直接到serarchmavenorg上下载jar包就好了。

下载的jar导入到工程里面就可以了,通常都是/libs目录下。

上面那个下载地址下载解压后有三个文件如下图

首先我们要创建java generator工程greendao-generator-130jar 和 freemarker-2320jar是我们创建java generator工程时生成Dao文件需要用到的(什么是我说的Dao文件,往下看就会知道)

greendao-137jar是Android开发中需要用到的

二创建generator工程(用来生成GreenDao开发过程中需要的java文件)

(1)创建Java工程(非Android工程) 

(2)导入greenDao-generatorjar和freemarkerjar两个包。freemarker是一个用java写的模板引擎,它能够基于模板来生成文本输出。应该就是用来自动生成DAO文件的。eclipse下面就是在properties –> Java build path –> libraries下面导入jar包。 

(3)创建一个包javagreendao 

(4)创建一个类,类名为ExampleDaoGenerator,类的定义如下:

package javagreendao;

import degreenrobotdaogeneratorDaoGenerator;

import degreenrobotdaogeneratorEntity;

import degreenrobotdaogeneratorProperty;

import degreenrobotdaogeneratorSchema;

import degreenrobotdaogeneratorToMany;

/

Generates entities and DAOs for the example project DaoExample

Run it as a Java application (not Android)

@author Markus

/

public class ExampleDaoGenerator

{

   //总之main函数就执行了下面几个函数                                                                                                                                                                                                                                             

   public static void main(String[] args) throws Exception

   {

   // 参数3是数据库版本号,“comcnspeedchatgreendao”是包名,也就是说生成的Dao文件会在这个包下,可以将Schema理解为数据库上下文吧

        Schema schema = new Schema(3, "comcnspeedchatgreendao");

        //addNote() addSession() addReplay()这三个函数相当于建立了三个表,表名你都可以不用管了会自动生成

       addNote(schema);      

       addSession(schema);

       addReplay(schema);

       addCustomerOrder(schema);

   //这个是生成Dao文件的路径的位置,这个代表当前工程的上一级目录的javagreendao的src-gen文件夹里面,其实就是跟src同一级目录,所以你自己要在src同一级目录下新建一个src-gen文件夹待会要生成的文件

       new DaoGenerator()generateAll(schema, "/javagreendao/src-gen");    

   }

     //这个是一个Note表,然后后面的nodeadd是表的字段名以及属性                                                                                                                                                                                          

   private static void addNote(Schema schema)                

   {

       //"MqttChatEntity"相当于是表的类名,用MqttChatEntity生成对象就可以访问这个表属性了,也就是这个表对应了这个类,待会使用你就会明白了

       Entity note = schemaaddEntity("MqttChatEntity");    

       noteaddIdProperty()autoincrement();

       noteaddIntProperty("mode")notNull();

       noteaddStringProperty("sessionid")notNull();

       noteaddStringProperty("from")notNull();

       noteaddStringProperty("to")notNull();

       noteaddStringProperty("v_code");

       noteaddStringProperty("timestamp")notNull();

       noteaddStringProperty("platform");

       noteaddStringProperty("message");

       noteaddBooleanProperty("isread")notNull();

       noteaddLongProperty("gossipid");

       noteaddStringProperty("gossip");

       noteaddIntProperty("chattype")notNull();

       noteaddStringProperty("imagepath");

       noteaddStringProperty("base64image");

   }

   //这个是一个Session表,然后后面的nodeadd是表的字段名以及属性(这是我写的会话的一个表)

   private static void addSession(Schema schema)    

   {

       Entity note = schemaaddEntity("SessionEntity");

       noteaddIdProperty()autoincrement();

       noteaddStringProperty("sessionid")notNull()unique();

       noteaddStringProperty("from")notNull();

       noteaddStringProperty("to")notNull();

       noteaddLongProperty("gossipid")notNull();

       noteaddStringProperty("gossip");

       noteaddIntProperty("sessiontype")notNull();

       noteaddBooleanProperty("asdasd")notNull();

   }

 //这个是一个Replay表,然后后面的nodeadd是表的字段名以及属性(这是我写的回复的一个表)

   private static void addReplay(Schema schema)

   {

       //ReplayEntity对应的类名

       Entity note = schemaaddEntity("ReplayEntity");    

       noteaddIdProperty()autoincrement();

       noteaddIntProperty("mode")notNull();

       noteaddStringProperty("from")notNull();

       noteaddStringProperty("to")notNull();

       noteaddStringProperty("v_code");

       noteaddStringProperty("timestamp")notNull();

       noteaddStringProperty("platform");

       noteaddStringProperty("message");

       noteaddIntProperty("msgtype")notNull();

       noteaddBooleanProperty("isread")notNull();

   }

   //这个不用管了,照抄吧

   private static void addCustomerOrder(Schema schema)    

   {

       Entity customer = schemaaddEntity("Customer");

       customeraddIdProperty();

       customeraddStringProperty("name")notNull();

       Entity order = schemaaddEntity("Order");

       ordersetTableName("ORDERS"); // "ORDER" is a reserved keyword

       orderaddIdProperty();

       Property orderDate = orderaddDateProperty("date")getProperty();

       Property customerId = orderaddLongProperty("customerId")notNull()getProperty();

       orderaddToOne(customer, customerId);

       ToMany customerToOrders = customeraddToMany(order, customerId);

       customerToOrderssetName("orders");

       customerToOrdersorderAsc(orderDate);

   }                                                                                                                                                                                                                                                                                                              

}

1)增加表如果你自己想加一些其他的表的话,你可以自己按照addSession,addNote ,addReplay三个函数的方式加,类名、字段名可以自己随便取比如说,比我我要加一个用户表,字段包括name,age,sex三个,我可以这样做

 private static void addUser(Schema schema)  

   {

       Entity note = schemaaddEntity("UserEntity");    

       noteaddIdProperty()autoincrement();

       noteaddStringProperty("name")notNull();

       noteaddIntProperty("age")notNull();

       //true代表男,false代表女

       noteaddBooleanProperty("sex")notNull();    

   }

然后在main函数里面做如下调用

   public static void main(String[] args) throws Exception

   {

       Schema schema = new Schema(3, "comcnspeedchatgreendao");    

       addNote(schema);        

       addSession(schema);

       addReplay(schema);

       addUser(schema);

       addCustomerOrder(schema);

       new DaoGenerator()generateAll(schema, "/javagreendao/src-gen");

   }

2)删除表当然一些不需要的表你可以不用,删掉就行,比如说你不须要addReplay,你就在main函数里面别调用addReplay(schema)就行

总之呢,这就是一个基于greenDao-generatorjar和freemarkerjar两个包的java工程

然后运行该工程,控制台打印出如下结果:

greenDAO Generator Copyright 2011-2013 Markus Junginger,

greenrobotde Licensed under GPL V3 This program comes with

ABSOLUTELY NO WARRANTY Processing schema version 3… Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/MqttChatEntityDaojava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/MqttChatEntityjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/SessionEntityDaojava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/SessionEntityjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/ReplayEntityDaojava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/ReplayEntityjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/CustomerDaojava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/Customerjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/OrderDaojava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/Orderjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/DaoMasterjava

Written

/home/csm/workspace/javagreendao/src-gen/com/cn/speedchat/greendao/DaoSessionjava

Processed 5 entities in 189ms

这代表成功的生成了Dao文件,然后我们按F5刷新该工程,在查看src-gen目录文件,自动生成了很多java文件,这就是我们要的,我这里截图给大家看

但是有很多错误是不是,没关系,这个工程识别不了这些文件,这些文件是基于greendao-137jar包的,是Android工程里面要用到的。先不管这个java工程了。

以上就是关于GreenDao insertOrReplace和save的区别全部的内容,包括:GreenDao insertOrReplace和save的区别、android greendao daosession有什么用、greendao的实体类可以是静态内部类吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10095185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存