• 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动态主题切换(RRO 技术)
    Android设计模式-单例模式
    Android 设计模式
    简单理解Binder机制的原理
    Android的Activity启动流程分析
    android 多线程实现方式、并发与同步学习总结
    RecyclerView 缓存机制 | 如何复用表项?
    recyclerview 缓存讲解
    csharp中实现图片拖拽
    特征提取的综合实验(多种角度比较SIFT、SURF、BRISK、ORB、FREAK等局部特诊点检测和描述算法)(2021版)
  • 原文地址:https://www.cnblogs.com/wjtaigwh/p/6394288.html
Copyright © 2020-2023  润新知