热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

greenDao的基本使用及用法详解

转载请标明出去:http:blog.csdn.netsmall_and_smallworld关于数据操作相关的库有不少,之前有写过用谷歌官方的一些工具类对数据库进行操作的de


       转载请标明出去: http://blog.csdn.net/small_and_smallworld  


关于数据操作相关的库有不少,之前有写过用谷歌官方的一些工具类对数据库进行操作的demo,工程中需要使用greenDao来对数据库进行操作,因此写了个简单的demo,以及自己的一些理解。

前言

        Android中的数据库使用的是Sqlite,至于这个玩意到底什么,不需要详细分析。你只需要知道,这是一种简单小巧轻量级的数据库类型,便于对一些简单的数据进行管理即可。这里不对谷歌官方操作的相关代码进行演示,只对greenDao的使用进行讲解。
PS:本笔记演示的greenDao版本为3.2.0

            GreenDao 优点:

1.性能高,号称Android最快的关系型数据库
2.内存占用小
3.库文件比较小,小于100K
4.支持数据库加密 greendao支持SQLCipher进行数据库加密
5.简洁易用的API

使用步骤:

第一步:在项目的Build.gradle中添加如下配置:

[java] view plain copy
  1. buildscript {  
  2.     repositories {  
  3.         jcenter()  
  4.         mavenCentral()  
  5.     }  
  6.     dependencies {  
  7.         classpath 'com.android.tools.build:gradle:1.5.0'  
  8.         classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'  
  9.     }  
  10. }  

第二步:导入
compile 'org.greenrobot:greendao:3.1.1'
compile 'org.greenrobot:greendao-generator:3.1.0'

第三步:添加配置


  第四步:写实体类User

@Entity
public class User {

@Id
private long id;
private String name;

@Generated(hash = 586692638)
public User() {
}

@Generated(hash = 1144922831)
public User(long id, String name) {
this.id = id;
this.name = name;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
 

greenDao多使用注解,如果你要将某一实体存储到数据库中,需要先对实体进行编写。
@Entity表明该类是持久化的类【持久化含义,存入数据库文件中,作本地化处理】
@Id选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键【类型要是long】
@Generated写在构造方法前
将以上注解写好后,点击AS上的Make Project即可

然后可以发现,你的Module中多了个包,点开可以看到如下


                红色框框内是greenDao自动生成的操作类
接下来就可以对数据库进行操作了
先上布局文件
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:text="greenDao lib test"
android:textColor="@android:color/black" />


<EditText
android:id="@+id/etId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户id"
android:inputType="number"
android:textSize="15sp" />


<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
android:textSize="15sp" />


<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="新增" />


<Button
android:id="@+id/btnDelete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除" />


<Button
android:id="@+id/btnQuery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:text="查询结果"
android:textColor="@android:color/black" />


<TextView
android:id="@+id/tvQuery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:textColor="@android:color/black" />


LinearLayout>

再来个图


greenDao_demo

然后是MainActivity

public class MainActivity extends AppCompatActivity {

UserDao userDao;
private EditText etId;
private EditText etName;
private Button btnAdd;
private Button btnDelete;
private Button btnQuery;
private TextView tvQuery;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initView();
initDbHelp();

/*新增一条数据*/
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String id = etId.getText().toString();
String name = etName.getText().toString();
if (isNotEmpty(id) && isNotEmpty(name)) {
QueryBuilder qb = userDao.queryBuilder();
ArrayList list = (ArrayList) qb.where(UserDao.Properties.Id.eq(id)).list();
if (list.size() > 0) {
Toast.makeText(MainActivity.this, "主键重复", Toast.LENGTH_SHORT).show();
} else {
userDao.insert(new User(Long.valueOf(id), name));
Toast.makeText(MainActivity.this, "插入数据成功", Toast.LENGTH_SHORT).show();
}
} else {
if (isEmpty(id) && isNotEmpty(name)) {
Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
}
if (isEmpty(name) && isNotEmpty(id)) {
Toast.makeText(MainActivity.this, "姓名为空", Toast.LENGTH_SHORT).show();
}
if (isEmpty(id) && isEmpty(name)) {
Toast.makeText(MainActivity.this, "请填写信息", Toast.LENGTH_SHORT).show();
}

}
etId.setText("");
etName.setText("");
}
});

/*删除指定数据*/
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String id = etId.getText().toString();
if (isNotEmpty(id)) {
userDao.deleteByKey(Long.valueOf(id));
QueryBuilder qb = userDao.queryBuilder();
ArrayList list = (ArrayList) qb.where(UserDao.Properties.Id.eq(id)).list();
if (list.size() <1) {
Toast.makeText(MainActivity.this, "删除数据成功", Toast.LENGTH_SHORT).show();
etId.setText("");
etName.setText("");
}
} else {
Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
}
}
});

/*查询数据*/
btnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String id = etId.getText().toString();
if (isNotEmpty(id)) {
QueryBuilder qb = userDao.queryBuilder();
ArrayList list = (ArrayList) qb.where(UserDao.Properties.Id.eq(id)).list();
if (list.size() > 0) {
String text = "";
for (User user : list) {
text = text + "\r\n" + user.getName();
}
tvQuery.setText(text);
} else {
tvQuery.setText("");
Toast.makeText(MainActivity.this, "不存在该数据", Toast.LENGTH_SHORT).show();
}
etId.setText("");
etName.setText("");
} else {
Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
}
}
});
}

/*初始化数据库相关*/
private void initDbHelp() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "recluse-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
userDao = daoSession.getUserDao();
}

private void initView() {
etId = (EditText) findViewById(R.id.etId);
etName = (EditText) findViewById(R.id.etName);
btnAdd = (Button) findViewById(R.id.btnAdd);
btnDelete = (Button) findViewById(R.id.btnDelete);
btnQuery = (Button) findViewById(R.id.btnQuery);
tvQuery = (TextView) findViewById(R.id.tvQuery);
}

private boolean isNotEmpty(String s) {
if (s != null && !s.equals("") || s.length() > 0) {
return true;
} else {
return false;
}
}

private boolean isEmpty(String s) {
if (isNotEmpty(s)) {
return false;
} else {
return true;
}
}

}

以上有一些判断是否成功的操作,因为greenDao并没有提供操作后的回调,所以我这里就只是手动判断一下

依次存入1/usher 、2/tom、3/harry 三组数据,然后提取数据库文件如下


Demo演示


好了,大功告成!!!



推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文介绍了如何使用 CMD 批处理脚本进行文件操作,包括将指定目录下的 PHP 文件重命名为 HTML 文件,并将这些文件复制到另一个目录。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
author-avatar
holy190
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有