1,最近看了一篇文章关于GreenDao的文章 ,感觉使用这个操作数据库还是很好用的,帮我们省了不少的查询代码,今天就和大家一起来简单的使用一下吧。首先这是官网地址:https://github.com/greenrobot/greendao,我们来按照文档一点点的来写一下

2,首先要认识一下GreenDao是使用ORM(Object RelationShop Mapping)对象关系映射,就是通过GreenDao将数据库和Bean关联起来有以下优点:

  • 存取速度快

  • 支持数据库加密

  • 轻量级

  • 激活实体

  • 支持缓存

  • 代码自动生成

3,接入,首先要在Project中的build中添加如下代码

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
} allprojects {
repositories {
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}

再在Module中的build添加引用

apply plugin: 'com.android.application'
//使用greendao
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2" defaultConfig {
applicationId "com.qianmo.greendaotest"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
//greendao配置
greendao {
//版本号,升级时可配置
schemaVersion 1
// daoPackage 'com.qianmo.greendaotest.gen'
// targetGenDir 'src/main/java'
} buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
} dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.android.support:design:25.1.1'
compile 'org.greenrobot:greendao:3.2.0' //greendao依赖 testCompile 'junit:junit:4.12'
}

  这样就配置成功了,接着是简单的使用。

4,使用,先来看一下我们的效果图

①创建ShopBean

package com.qianmo.greendaotest.bean;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Unique;
import org.greenrobot.greendao.annotation.Generated; /**
* Created by wangjitao on 2017/2/13 0013.
* E-Mail:543441727@qq.com
*
* Bean 对象注释的解释
*
* @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
*/ @Entity
public class Shop {
//表示是购物车列表
public static final int TYPE_CART = 0x01;
//表示为收藏列表
public static final int TYPE_LOVE = 0x02; //不能用int (ID 表示标识主键 且主键不能用int autoincrement = true 表示主键会自增)
@Id(autoincrement = true)
private Long id; //商品名称 (unique 表示该属性必须在数据库中是唯一的值)
@Unique
private String name; //商品价格(可以自定义字段名,注意外键不能使用该属性)
@Property(nameInDb = "price")
private String price; //已售数量
private int sell_num; //图标url
private String image_url; //商家地址
private String address; //商品列表分类
private int type; @Generated(hash = 1304458862)
public Shop(Long id, String name, String price, int sell_num, String image_url,
String address, int type) {
this.id = id;
this.name = name;
this.price = price;
this.sell_num = sell_num;
this.image_url = image_url;
this.address = address;
this.type = type;
} @Generated(hash = 633476670)
public Shop() {
} public Long getId() {
return this.id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
} public String getPrice() {
return this.price;
} public void setPrice(String price) {
this.price = price;
} public int getSell_num() {
return this.sell_num;
} public void setSell_num(int sell_num) {
this.sell_num = sell_num;
} public String getImage_url() {
return this.image_url;
} public void setImage_url(String image_url) {
this.image_url = image_url;
} public String getAddress() {
return this.address;
} public void setAddress(String address) {
this.address = address;
} public int getType() {
return this.type;
} public void setType(int type) {
this.type = type;
} }

  对Bean中的对象进行解释

  • @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
  • @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
  • @Property:可以自定义字段名,注意外键不能使用该属性
  • @NotNull:属性不能为空
  • @Transient:使用该注释的属性不会被存入数据库的字段中
  • @Unique:该属性值必须在数据库中是唯一值
  • @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改

②创建数据库名称

package com.qianmo.greendaotest;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase; import com.qianmo.greendaotest.bean.DaoMaster;
import com.qianmo.greendaotest.bean.DaoSession; /**
* Created by wangjitao on 2017/2/13 0013.
* E-Mail:543441727@qq.com
*/ public class BaseApplication extends Application {
private static DaoSession daoSession; @Override
public void onCreate() {
super.onCreate(); //配置数据库
setupDatabase();
} /**
* 配置数据库
*/
private void setupDatabase() {
//创建数据库shop.db
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "shop.db", null);
//获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取dao对象管理者
daoSession = daoMaster.newSession();
} public static DaoSession getDaoInstant() {
return daoSession;
} }

这里我们需要创建一个Application,在代码中初始化数据库的基本数据,这里要讲解这下面这三个类

  • DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现

  • DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表

  • DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API

这里注意一下我们要编译一下我们的工程(ctrl+F9),因为上面三个类是运行时创建的,还有相应的Shop中的set和get方法及构造函数

③添加一个Dao,提供简单的Shop对象的增删该查的简单方法

package com.qianmo.greendaotest.dao;

import com.qianmo.greendaotest.BaseApplication;
import com.qianmo.greendaotest.bean.Shop;
import com.qianmo.greendaotest.bean.ShopDao; import java.util.List; /**
* Created by wangjitao on 2017/2/13 0013.
* E-Mail:543441727@qq.com
* 使用GreenDao 实现简单的增删改查,下面是基本方法
* 增加单个数据
* getShopDao().insert(shop);
* getShopDao().insertOrReplace(shop);
* 增加多个数据
* getShopDao().insertInTx(shopList);
* getShopDao().insertOrReplaceInTx(shopList);
* 查询全部
* List< Shop> list = getShopDao().loadAll();
* List< Shop> list = getShopDao().queryBuilder().list();
* 查询附加单个条件
* .where()
* .whereOr()
* 查询附加多个条件
* .where(, , ,)
* .whereOr(, , ,)
* 查询附加排序
* .orderDesc()
* .orderAsc()
* 查询限制当页个数
* .limit()
* 查询总个数
* .count()
* 修改单个数据
* getShopDao().update(shop);
* 修改多个数据
* getShopDao().updateInTx(shopList);
* 删除单个数据
* getTABUserDao().delete(user);
* 删除多个数据
* getUserDao().deleteInTx(userList);
* 删除数据ByKey
* getTABUserDao().deleteByKey();
*/ public class ShopDao { /**
* 添加数据,如果有重复则覆盖
*
* @param shop
*/
public static void insertShop(Shop shop) {
BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop);
} /**
* 删除数据
*
* @param id
*/
public static void deleteShop(long id) {
BaseApplication.getDaoInstant().getShopDao().deleteByKey(id);
} /**
* 更新数据
*/
public static void updateShop(Shop shop) {
BaseApplication.getDaoInstant().getShopDao().update(shop);
} /**
* 查询Type为1的所有数据
*
* @return
*/
public static List<Shop> queryShop() {
return BaseApplication.getDaoInstant().getShopDao().queryBuilder().where(ShopDao.Properties.Type.eq(Shop.TYPE_CART)).list(); } /**
* 查询所有数据
*
* @return
*/
public static List<Shop> queryAll() {
return BaseApplication.getDaoInstant().getShopDao().loadAll();
} }

  Dao中其它的一些方法

  • 增加单个数据

    • getShopDao().insert(shop);

    • getShopDao().insertOrReplace(shop);

  • 增加多个数据

    • getShopDao().insertInTx(shopList);

    • getShopDao().insertOrReplaceInTx(shopList);

  • 查询全部

    • List< Shop> list = getShopDao().loadAll();

    • List< Shop> list = getShopDao().queryBuilder().list();

  • 查询附加单个条件

    • .where()

    • .whereOr()

  • 查询附加多个条件

    • .where(, , ,)

    • .whereOr(, , ,)

  • 查询附加排序

    • .orderDesc()

    • .orderAsc()

  • 查询限制当页个数

    • .limit()

  • 查询总个数

    • .count()

  • 修改单个数据

    • getShopDao().update(shop);

  • 修改多个数据

    • getShopDao().updateInTx(shopList);

  • 删除单个数据

    • getTABUserDao().delete(user);

  • 删除多个数据

    • getUserDao().deleteInTx(userList);

  • 删除数据ByKey

    • getTABUserDao().deleteByKey();

④这样我们就基本上完成了,这里我们写一个界面来展示一下吧

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.qianmo.greendaotest.MainActivity"
tools:showIn="@layout/activity_main"> <LinearLayout
android:id="@+id/ll_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
> <Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="增加"/> <Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="删除"/> <Button
android:id="@+id/btn_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="修改"/> <Button
android:id="@+id/btn_query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="查询"/> </LinearLayout> <ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/ll_btn"> </ListView> </RelativeLayout>

MainActivity.java

package com.qianmo.greendaotest;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.ListView; import com.qianmo.greendaotest.adapter.ShopListAdapter;
import com.qianmo.greendaotest.bean.Shop;
import com.qianmo.greendaotest.dao.LoveDao; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_add;
private Button btn_edit;
private Button btn_delete;
private Button btn_query; private ListView listView; private List<Shop> shops;
private ShopListAdapter adapter; private int i; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}); initView();
initData();
} private void initData() {
shops = new ArrayList<>();
shops = LoveDao.queryShop();
adapter = new ShopListAdapter(this, shops);
listView.setAdapter(adapter);
} private void initView() { btn_add = (Button) findViewById(R.id.btn_add);
btn_edit = (Button) findViewById(R.id.btn_edit);
btn_delete = (Button) findViewById(R.id.btn_delete);
btn_query = (Button) findViewById(R.id.btn_query);
listView = (ListView) findViewById(R.id.listView); btn_add.setOnClickListener(this);
btn_edit.setOnClickListener(this);
btn_delete.setOnClickListener(this);
btn_query.setOnClickListener(this); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} private void addDate() {
Shop shop = new Shop();
shop.setType(Shop.TYPE_CART);
shop.setAddress("广东深圳");
shop.setImage_url("https://img.alicdn.com/bao/uploaded/i2/TB1N4V2PXXXXXa.XFXXXXXXXXXX_!!0-item_pic.jpg_640x640q50.jpg");
shop.setPrice("19.40");
shop.setSell_num(15263);
shop.setName("正宗梅菜扣肉 聪厨梅干菜扣肉 家宴常备方便菜虎皮红烧肉 2盒包邮" + i++);
LoveDao.insertShop(shop);
initData();
} private void updateDate() {
if (!shops.isEmpty()) {
Shop shop = shops.get(0);
shop.setName("我是修改的名字");
LoveDao.updateShop(shop);
initData();
}
} private void deleteDate() {
if (!shops.isEmpty()) {
LoveDao.deleteShop(shops.get(0).getId());
initData();
}
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_add:
addDate();
break;
case R.id.btn_edit:
updateDate();
break;
case R.id.btn_delete:
deleteDate();
break;
case R.id.listView:
initData();
break;
}
}
}

Adapter

package com.qianmo.greendaotest.adapter;

import android.content.Context;
import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import com.qianmo.greendaotest.R;
import com.qianmo.greendaotest.bean.Shop; import java.util.List; import static android.R.id.list; /**
* Created by Administrator on 2017/2/13 0013.
* E-Mail:543441727@qq.com
*/ public class ShopListAdapter extends BaseAdapter {
private Context context;
private List<Shop> datas;
private LayoutInflater mInflater; public ShopListAdapter(Context context, List<Shop> datas) {
this.context = context;
this.datas = datas;
mInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return datas.size();
} @Override
public Object getItem(int position) {
return datas.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adapter_shop_list, null);
}
ViewHolder holder = getViewHolder(convertView);
Shop shop = datas.get(position); holder.iv_shop.setImageResource(R.mipmap.ic_launcher);
holder.tv_name.setText(shop.getName());
holder.tv_price.setText(shop.getPrice() + "");
holder.tv_price_discount.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
holder.tv_sell_num.setText("已售" + shop.getSell_num() + "件");
return convertView;
} /**
* 获得控件管理对象
*
* @param view
* @return
*/
private ViewHolder getViewHolder(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (holder == null) {
holder = new ViewHolder(view);
view.setTag(holder);
}
return holder;
} /**
* 控件管理类
*/
private class ViewHolder {
private TextView tv_name, tv_price, tv_price_discount, tv_sell_num;
private ImageView iv_shop; ViewHolder(View view) {
tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_price = (TextView) view.findViewById(R.id.tv_price);
tv_price_discount = (TextView) view.findViewById(R.id.tv_price_discount);
tv_sell_num = (TextView) view.findViewById(R.id.tv_sell_num);
iv_shop = (ImageView) view.findViewById(R.id.iv_shop);
}
}
}

ok,这样我们就完成了,看一下效果

See you next time!

  

Android -- GreenDao3.2的简单使用的更多相关文章

  1. GreenDao3.2的简单使用

    Android -- GreenDao3.2的简单使用http://www.cnblogs.com/wjtaigwh/p/6394288.html https://github.com/greenro ...

  2. Xamarin.Android之封装个简单的网络请求类

    一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...

  3. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

  4. [原创]Android中LocationManager的简单使用,获取当前位置

    Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近 ...

  5. Android下实现一个简单的计算器源码

    下面的内容是关于Android下实现一个简单的计算器的内容. import android.app.Activity; import android.os.Bundle;import android. ...

  6. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  7. Android 6.0 超级简单的权限申请2 (Permission)

    代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...

  8. Android 6.0 超级简单的权限申请 (Permission)

    代码地址如下:http://www.demodashi.com/demo/13369.html 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐 ...

  9. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

随机推荐

  1. n个元素的数组向左循环移动i个位置

    算法的完美 时间:2012-03-19 / 分类:学习园地,网络文摘 / 浏览:1797 / 0个评论 发表评论 考虑一个问题:将一个具有n个元素的数组向左循环移动i个位置.有许多应用程序会调用这个问 ...

  2. JavaScript面向对象之函数构造器的理解

    1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...

  3. Linux下的几种IPC方式及其C语言实现

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. Linux的磁盘系统和文件系统显示的文件大小为什么不一样(du指令和ls指令的区别)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  5. Ubuntu16.04LTS卸载软件的命令

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  6. [daily][qemu][kvm] qemu增加减少CPUID

    做 DPDK 大页内存测试, 发现KVM模拟出来的CPU不支持 1GB 的大页 可以使用如下命令是否支持: [root@dpdk ~]# cat /proc/cpuinfo |grep pdpe1gb ...

  7. 《linux 计划任务》- cron

    一:什么是计划任务 - 你给手机定了一个闹钟,每天的 7:00 会准时响铃叫你起床,这实际上就是一个计划任务 - 所谓定时任务,就是在已经定好的特定时间去执行的事情. - Cron是一个[守护程序]用 ...

  8. vue项目中 如何让外部引入的js模块 的this值 指向vue实例

    当前是vue项目,想在tool.js(工具模块)中封装一个跳转页面的方法, goToUrl(name,query){ if(query){ if(query.addressCode){ vueObje ...

  9. 贪吃蛇java版

    主要的蛇的类 import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import ja ...

  10. C# Asp.net使用FormData对象实现ajax提交表单及上传图片

    1.html代码: <form id="postForm"> 文件名:<input type="text" name="filena ...