Android ORM 框架之greenDAO

greenDAO——greenRobot公司出品

dao:data access object,数据访问对象层,用于查询数据库并产生数据的层

使用流程:
导包:
一、在整个工程的build.gradle中配置插件的代码,一会将会使用插件自动生成一些我们需要的类。
二、在app文件夹下的build.gradle中配置

1、封装数据模型类bean,使用注解配置当前bean对应数据库的哪个表,bean中的属性对应表中的哪个列名
2、使用插件生成一些必要的类,自动生成的类都是根据bean自动创建
自动创建3个类:build -> Make Module 'app'。创建类的位置:app -> build -> generated -> source -> greendao -> 包名
DaoMaster:整个框架的主干类,用于产生DaoSession
DaoSession:会话,代表一次操作数据库的过程,用于产生XXXDao
(官方建议将初始化操作写在整个应用的全局环境中,即自定义Application类中)
XXXDao:数据模型类对应的dao对象,真正用于操作数据库的类,通过该类执行CRUD

3、创建数据库助手类DevOpenHelper,并且指定数据库文件名
4、使用助手创建对应的数据库对象
5、根据数据库对象创建对应的会话DaoSession,我们真正操作数据库的动作就是在会话环境中执行

6、根据会话获取真正操作数据库的dao对象,它就可以执行CRUD操作。



需要添加的依赖与配置:

// 配置greenDAO
greendao {
    schemaVersion 2// 数据库版本号
}

Glide
compile 'com.github.bumptech.glide:glide:3.8.0'


Retrofit
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'


RxJava+Retrofit
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    compile "io.reactivex.rxjava2:rxjava:2.1.5"
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'


greenDAO
整个工程中的build.gradle中添加:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'


app模块下的build.gradle中添加:
apply plugin: 'org.greenrobot.greendao'
compile 'org.greenrobot:greendao:3.2.2'


AVLoadingIndicatorView
    compile 'com.wang.avi:library:1.0.0'






布局文件.xml:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.greendao.activity.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/insert_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="插入数据"/>

        <Button
            android:id="@+id/delete_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除数据"/>

        <Button
            android:id="@+id/update_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="修改数据"/>

        <Button
            android:id="@+id/query_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查询数据"/>

    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:background="#0f0"
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>

</LinearLayout>

item_food.xml

<?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="wrap_content"
              android:orientation="vertical">

    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/price_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>


执行文件.java:

DBHelper.java

package com.example.greendao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    // 监听数据库版本更新
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
 
创建activity目录:
MainActivity.java
package com.example.greendao.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.greendao.R;
import com.example.greendao.application.MyApplication;
import com.example.greendao.bean.FoodBean;

import com.example.greendao.adapter.FoodAdapter;
import com.example.greendao.application.MyApplication;
import com.example.greendao.bean.FoodBean;
import com.example.greendao.bean.FoodBeanDao;

import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    protected Button mInsertBtn;
    protected Button mDeleteBtn;
    protected Button mUpdateBtn;
    protected Button mQueryBtn;
    protected RecyclerView mRecyclerView;
    private FoodBeanDao mDao;
    private FoodAdapter mAdapter;

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

        // 获取能够执行增删改查操作的dao对象
        mDao = MyApplication.getDaoSession()
                .getFoodBeanDao();
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.insert_btn) {
            insertData();
        } else if (view.getId() == R.id.delete_btn) {
            deleteData();
        } else if (view.getId() == R.id.update_btn) {
            updateData();
        } else if (view.getId() == R.id.query_btn) {
            queryData();
        }
    }

    private void initView() {
        mInsertBtn = (Button) findViewById(R.id.insert_btn);
        mInsertBtn.setOnClickListener(MainActivity.this);
        mDeleteBtn = (Button) findViewById(R.id.delete_btn);
        mDeleteBtn.setOnClickListener(MainActivity.this);
        mUpdateBtn = (Button) findViewById(R.id.update_btn);
        mUpdateBtn.setOnClickListener(MainActivity.this);
        mQueryBtn = (Button) findViewById(R.id.query_btn);
        mQueryBtn.setOnClickListener(MainActivity.this);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        mAdapter = new FoodAdapter(this);
        mRecyclerView.setAdapter(mAdapter);
    }

    // 插入数据
    // 判断数据库中是否存在数据,如果不存在则插入
    // 查询一遍数据库,如果能查询到菜名叫油焖大虾的数据,就不再插入重复数据了
    private void insertData() {
        // 查询数据,查询条件是name为油焖大虾
        Query<FoodBean> query = mDao.queryBuilder()
                // where查询条件
                // 哪个表的属性:哪个属性,值为多少多少
                // select * from FoodBean where Price = 998
                .where(FoodBeanDao.Properties.Price.eq(998))
                .build();
        // 查询一个foodbean对象,只要存在一个,就没必要重复插入了
        FoodBean queryBean = query.unique();
        // 如果数据库中不存在符合条件的数据,返回结果为null
        if (queryBean == null) {
            FoodBean insertBean = new FoodBean(System.currentTimeMillis(), "油焖大虾", 998);
            mDao.insert(insertBean);
            Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();
        }


    }

    // 删除数据
    // 删除大于500的food
    private void deleteData() {
        Query<FoodBean> query = mDao.queryBuilder()
                .where(FoodBeanDao.Properties.Price.gt(500))// 大于
                .build();
        List<FoodBean> foodBeanList = query.list();
        if (foodBeanList != null && foodBeanList.size() > 0) {
            for (FoodBean foodBean : foodBeanList) {
                mDao.delete(foodBean);
            }
        }
        Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
    }

    // 修改数据,前提是数据库中能够找到要修改的数据
    // 修改价格大于等于500块的food
    private void updateData() {
        Query<FoodBean> query = mDao.queryBuilder()
                .where(FoodBeanDao.Properties.Price.ge(500))// 大于等于
                .build();
        List<FoodBean> foodBeanList = query.list();
        // 如果集合为null或者大小为0,没必要修改数据
        if (foodBeanList == null || foodBeanList.size() == 0) {
            return;
        }
        for (FoodBean foodBean : foodBeanList) {
            foodBean.setPrice(498);
            mDao.update(foodBean);
        }
        Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
    }

    // 查询全部数据,降序
    private void queryData() {
        // 获取一个查询对象的构建者,使用构建者构建一个查询对象,并且将查询条件作为配置
        QueryBuilder<FoodBean> queryBuilder = mDao.queryBuilder();
        Query<FoodBean> query = queryBuilder
                .orderDesc(FoodBeanDao.Properties.Price)// order by Price desc
                .build();
        // 查询全部数据
        List<FoodBean> list = query.list();

        Log.d("1510", "size: " + list.size());

        mAdapter.addDatas(list);
    }

}

 
创建adapter目录:
FoodAdapter.java
package com.example.greendao.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.greendao.R;
import com.example.greendao.bean.FoodBean;

import java.util.ArrayList;
import java.util.List;

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {

    private Context mContext;
    private List<FoodBean> mDatas;

    public FoodAdapter(Context context) {
        mContext = context;
        mDatas = new ArrayList<>();
    }

    // 添加数据
    public void addDatas(List<FoodBean> datas){
        mDatas.clear();
        mDatas.addAll(datas);
        notifyDataSetChanged();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(mContext)
                .inflate(R.layout.item_food, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        FoodBean food = mDatas.get(position);

        holder.mTitleTextView.setText(food.getName());
        holder.mPriceTextView.setText(food.getPrice() + "");
    }

    @Override
    public int getItemCount() {
        return mDatas== null ? 0 : mDatas.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        TextView mTitleTextView;
        TextView mPriceTextView;

        public ViewHolder(View itemView) {
            super(itemView);

            mTitleTextView = ((TextView) itemView.findViewById(R.id.title_tv));
            mPriceTextView = ((TextView) itemView.findViewById(R.id.price_tv));
        }
    }

}

 
创建application目录:
MyApplication.java
package com.example.greendao.application;

import android.app.Application;
import android.util.Log;

import com.example.greendao.bean.DaoMaster;
import com.example.greendao.bean.DaoSession;

import org.greenrobot.greendao.database.Database;

public class MyApplication extends Application {

    public static final String DB_NAME = "my_database.db";

    // 一个工程中只创建一次会话即可,使用单例
    private static DaoSession sDaoSession;

    // 当app启动时最先执行该方法,通常执行一些初始化操作
    @Override
    public void onCreate() {
        super.onCreate();

        initGreenDAO();
    }

    private void initGreenDAO() {
        // 1、创建数据库助手实例,并且指定数据库文件名
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, DB_NAME) {

            // 数据库版本更新回调
            @Override
            public void onUpgrade(Database db, int oldVersion, int newVersion) {
                super.onUpgrade(db, oldVersion, newVersion);

                Log.d("1510", "old: " + oldVersion + ", new : " + newVersion);
            }
        };
        // 2、通过助手创建Database实例
        Database db = helper.getWritableDb();
        // 3、根据db主干创建Session会话,在会话中可以操作数据库
        sDaoSession = new DaoMaster(db).newSession();
    }

    public static DaoSession getDaoSession() {
        return sDaoSession;
    }
}

 
创建bean目录:
FoodBean.java

package com.example.greendao.bean;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;

@Entity
public class FoodBean {

    @Id(autoincrement = true)// greenDAO3设置自增无效,可以使用时间戳作为主键
    private long id;
    private String name;
    private int price;

    @Generated(hash = 1633110902)
    public FoodBean(long id, String name, int price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Generated(hash = 895705851)
    public FoodBean() {
    }

    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 int getPrice() {
        return this.price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值