GreenDao基本使用

文章目的

今天,因为开发项目中需要使用的数据库,网上搜索Android中数据库框架的对比资料(自己斟酌,大概看看优缺点),最后决定使用greenDao,所以作此记录。

添加插件

在项目的build.gradle文件中添加greenDao插件:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

配置数据库信息,引入依赖

1、在app的build.gradle文件中应用greenDao插件
apply plugin: 'org.greenrobot.greendao' // 应用greenDao插件
2、配置数据库相关信息

greendao {
    schemaVersion 1 // 数据库版本号
    daoPackage 'com.example.appName.db' // 设置DaoMaster、DaoSession、Dao包名
    targetGenDir 'src/main/java' // 设置DaoMaster、DaoSession、Dao目录
}

3、引入greenDao依赖
implementation 'org.greenrobot:greendao:3.2.2'

编写实体类

编写实体类就相当于建表了

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

/**
 * 匹配度表
 */
@Entity
public class Match {
    @Id(autoincrement = true)
    private Long orderId; // Currently, entities must have a long or Long property as their primary key. This is recommended practice for Android and SQLite.
    @Index(unique = true)
    private String key; // 订单编号作为唯一索引

    private double matchRate; // 匹配度

    @Generated(hash = 1200748356)
    public Match(Long orderId, String key, double matchRate) {
        this.orderId = orderId;
        this.key = key;
        this.matchRate = matchRate;
    }

    @Generated(hash = 1834681287)
    public Match() {
    }

    public Long getOrderId() {
        return this.orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public String getKey() {
        return this.key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public double getMatchRate() {
        return this.matchRate;
    }

    public void setMatchRate(double matchRate) {
        this.matchRate = matchRate;
    }
}

写好实体类后点击Android studio的锤子,build一下项目就会在你刚刚在app的build.gradle文件中配置的目录信息中生成db文件夹和Dao文件

有坑提示:greenDao支持的主键的类型为long/Long,如果需要其他类型的主键,只能再用@Index注解再见一个索引,如:

@Index(unique = true)
private String key; // 订单编号作为唯一索引

编写DbManager和Dao操作类

DbManager 用于创建数据库,获取 DaoSession 和 DaoMaster

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

import com.xunjie.honorclient.db.DaoMaster;
import com.xunjie.honorclient.db.DaoSession;

public class DbManager {
    // 是否加密
    public static final boolean ENCRYPTED = true;

    private static final String DB_NAME = "hc.db";
    private static DbManager mDbManager;
    private static DaoMaster.DevOpenHelper mDevOpenHelper;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;

    private Context mContext;

    private DbManager(Context context) {
        this.mContext = context;
        // 初始化数据库信息
        mDevOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        getDaoMaster(context);
        getDaoSession(context);
    }

    public static DbManager getInstance(Context context) {
        if (null == mDbManager) {
            synchronized (DbManager.class) {
                if (null == mDbManager) {
                    mDbManager = new DbManager(context);
                }
            }
        }
        return mDbManager;
    }

    /**
     * 获取可读数据库
     * @param context
     * @return
     */
    public static SQLiteDatabase getReadableDatabase(Context context) {
        if (null == mDevOpenHelper) {
            getInstance(context);
        }
        return mDevOpenHelper.getReadableDatabase();
    }

    /**
     * 获取DaoMaster
     * 判断是否存在数据库,如果没有则创建数据库
     * @param context
     * @return
     */
    public static DaoMaster getDaoMaster(Context context) {
        if (null == mDaoMaster) {
            synchronized (DbManager.class) {
                if (null == mDaoMaster) {
                    MyOpenHelper helper = new MyOpenHelper(context, DB_NAME, null);
                    mDaoMaster = new DaoMaster(helper.getWritableDatabase());
                }
            }
        }
        return mDaoMaster;
    }


    /**
     * 获取DaoSession
     * @param context
     * @return
     */
    public static DaoSession getDaoSession(Context context) {
        if (null == mDaoSession) {
            synchronized (DbManager.class) {
                mDaoSession = getDaoMaster(context).newSession();
            }
        }
        return mDaoSession;
    }
}

Dao操作文件就是对具体表的操作的封装类

import android.content.Context;

import com.xunjie.honorclient.db.MatchDao;
import com.xunjie.honorclient.entity.Match;
import com.zaaach.citypicker.db.DBManager;

import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

/**
 * Match表操作类
 */
public class MatchDaoOpe {
    /**
     * 插入一条数据
     * @param context
     * @param match
     */
     public static void insertData(Context context, Match match) {
         DbManager.getDaoSession(context).getMatchDao().insert(match);
     }

    /**
     * 将数据实体通过事务添加至数据库
     * @param context
     * @param list
     */
    public static void insertData(Context context, List<Match> list) {
        if (null == list || list.size() <= 0) {
            return;
        }
        DbManager.getDaoSession(context).getMatchDao().insertInTx(list);
    }

    /**
     * 将数据添加至数据库,判断主键,如果主键存在则只需update,否则只需insert
     * @param context
     * @parma match
     */
    public static void saveData(Context context, Match match) {
        Match oldMatch = queryByKey(context, match.getKey());
        if (oldMatch != null) {
            if (oldMatch.getMatchRate() != match.getMatchRate()) {
                oldMatch.setMatchRate(match.getMatchRate());
                updateData(context, oldMatch);
            }
        } else {
            DbManager.getDaoSession(context).getMatchDao().save(match);
        }
    }

    /**
     * 删除数据
     * @param context
     * @param match 删除具体内容
     */
    public static void delData(Context context, Match match) {
        DbManager.getDaoSession(context).getMatchDao().delete(match);
    }

    /**
     * 根据主键删除数据
     * @param context
     * @param id
     */
    public static void delByKey(Context context, Long id) {
        DbManager.getDaoSession(context).getMatchDao().deleteByKey(id);
    }

    /**
     * 删除全部数据
     * @param context
     */
    public static void delAll(Context context) {
        DbManager.getDaoSession(context).getMatchDao().deleteAll();
    }

    /**
     * 更新数据
     * @param context
     * @param match
     */
    public static void updateData(Context context, Match match) {
        DbManager.getDaoSession(context).getMatchDao().update(match);
    }

    /**
     * 根据索引查询数据
     * @param context
     * @param key
     * @return
     */
    public static Match queryByKey(Context context, String key) {
        QueryBuilder<Match> builder = DbManager.getDaoSession(context).getMatchDao().queryBuilder();
        return  builder.where(MatchDao.Properties.Key.eq(key)).unique();
    }

    /**
     * 查询所有数据
     * @parma context
     * @return
     */
    public static List<Match> queryAll(Context context) {
        QueryBuilder<Match> builder = DbManager.getDaoSession(context).getMatchDao().queryBuilder();
        return builder.build().list();
    }

    /**
     * 分页加载
     * @param context
     * @param pageSize 当前第几页
     * @param pageNum 每页显示数量
     */
    public static List<Match> queryPaging(int pageSize, int pageNum, Context context) {
        MatchDao matchDao = DbManager.getDaoSession(context).getMatchDao();
        List<Match> list = matchDao.queryBuilder()
                .offset(pageSize * pageNum).limit(pageNum).list();
        return list;
    }

}

数据库升级的相关内容

这一块内容直接给出我写这篇文章时查找学习的文章链接,写的很详细。
链接: GreenDao3.2使用详解(增,删,改,查,升级).

真机调试查看数据库

如果想要真机调试时方便查看数据库,可以使用SQLiteStudio这个工具。
下载链接:SQLiteStudio

使用方法可以参考这篇文章:
SQLiteStudio优雅调试Android手机数据库Sqlite

发布了4 篇原创文章 · 获赞 2 · 访问量 362

猜你喜欢

转载自blog.csdn.net/weixin_29210367/article/details/103992864