Android -- GreenDao3.2的简单使用
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的简单使用的更多相关文章
- GreenDao3.2的简单使用
Android -- GreenDao3.2的简单使用http://www.cnblogs.com/wjtaigwh/p/6394288.html https://github.com/greenro ...
- Xamarin.Android之封装个简单的网络请求类
一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...
- [电子书] 《Android编程入门很简单》
<Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...
- [原创]Android中LocationManager的简单使用,获取当前位置
Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近 ...
- Android下实现一个简单的计算器源码
下面的内容是关于Android下实现一个简单的计算器的内容. import android.app.Activity; import android.os.Bundle;import android. ...
- android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】
android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...
- Android 6.0 超级简单的权限申请2 (Permission)
代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...
- Android 6.0 超级简单的权限申请 (Permission)
代码地址如下:http://www.demodashi.com/demo/13369.html 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐 ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
随机推荐
- linux添加新硬盘
1.添加新磁盘 2.fdisk -l查看磁盘被识别的名称 3.如果输入fdisk -l命令没有找到新的磁盘,按下面步骤操作 1)进入到cd /sys/class/scsi_host/ 2)echo & ...
- OPTIMIZE TABLE linked list 表优化原理 链表数据结构 空间再利用
小结: 1.加快读写: 2.对于InnoDB表,在一定条件下,通过复制旧表重建: 3.实践中, 3.1.show processlist;查看线程,发现,认为堵塞读请求: 3.2.数据长度空间不变,索 ...
- iOS开发 - 事件传递响应链
序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...
- LeetCode 812 Largest Triangle Area 解题报告
题目要求 You have a list of points in the plane. Return the area of the largest triangle that can be for ...
- python作用域问题
今天出了个低级的错误,最后确定是作用域问题,特回顾知识点如下: 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. Python的作 ...
- Maven项目常见的小问题
pom.xml文件头报错 场景 例Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4 from ...
- 如何使用List<HashMap<String, String>>详细讲解
场景:要循环界面Table数据源与导出Excel数据源作对比. 说明: List<HashMap<String,String>> List中每一项都是一个HashMap Ha ...
- 洛谷P3224 永无乡 [HNOI2012] 线段树/splay/treap
正解:线段树合并 解题报告: 传送门! 这题也是有很多解法,eg:splay,treap,... 然而我都不会我会学的QAQ! 反正今天就只讲下线段树合并怎么做QAQ 首先看到这样子的说第k重要的是什 ...
- 500 G JAVA视频网盘分享(JEECG开源社区)
500 G JAVA视频网盘分享(JEECG开源社区) [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] [转载:h ...
- 数据库机器迁移对AlwaysON 集群影响测试
1主3从(共享文件见证) 模拟事故 AlwaysON集群 结论 主域控服务器重启 共享文件夹见证失败,SQL集群无影响 无影响 修改共享文件夹见证路径 第一次测试修改后:整个集群突然重启,查询 ...