欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在本地保存数据问题中GreenDao的使用

程序员文章站 2022-11-21 08:09:25
最近在开发过程中产品提了一个需求就是在账号登录成功以后在本地保存账号的信息,用来完成后续的账号切换,以及在登录成功以后的登录历史记录,我是用greendao去实现的 当然这里的实现方式有很多,后来也看了一些别的,言归正传,说一下如何去使用; **第一步就是在gradle中去配置啦:**先把greendao的包引进来这里需要注意的是版本号 schemaVersion ,在开发过程中我遇到......

最近在开发过程中产品提了一个需求就是在账号登录成功以后在本地保存账号的信息,用来完成后续的账号切换,以及在登录成功以后的登录历史记录,我是用greendao去实现的 当然这里的实现方式有很多,后来也看了一些别的,言归正传,说一下如何去使用.
第一步就是在gradle中去配置啦:
先把greendao的包引进来这里需要注意的是版本号 schemaVersion ,在开发过程中我遇到过就是在改变实体的时候如果不更改版本号重新运行生成,就会报错,每次更改实体都会自动生成getset方法的。

apply plugin: 'org.greenrobot.greendao'
greendao {
    schemaVersion 1
}
implementation 'org.greenrobot:greendao:3.2.2'

第二步,创建实体类:

@Id(autoincrement = true)
private Long id;

@Property(nameInDb = "uid")
@Index(unique = true)
private String uid;

@Property(nameInDb = "email")
private String email;

@Property(nameInDb = "phone")
private String phone;

这里实体中所需要的参数像上面的这种格式创建好之后编译一下就会自动生成如下的代码了:

@Generated(hash = 640756004)
public UserEntity(Long id, String uid, String email, String phone,
        String avatar, String nick, int parent_rid, String username,
        String access_token, int invalid_time, String logintime, int rid,
int logintype, String loginTimeSelf) {
this.id = id;
this.uid = uid;
this.email = email;
this.phone = phone;
this.avatar = avatar;
this.nick = nick;
this.parent_rid = parent_rid;
this.username = username;
this.access_token = access_token;
this.invalid_time = invalid_time;
this.logintime = logintime;
this.rid = rid;
this.logintype = logintype;
this.loginTimeSelf = loginTimeSelf;
}
  
@Generated(hash = 1433178141)
public UserEntity() {
}

public Long getId() {
return this.id;
}

public void setId(Long id) {
this.id = id;
}

public String getUid() {
return this.uid;
}
public void setUid(String uid) {
this.uid = uid;
}

public String getEmail() {
return this.email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPhone() {
return this.phone;
}

public void setPhone(String phone) {
this.phone = phone;
}
**第三步设置GreenDao:**
我们需要去创建数据库连接以及数据表:
public static void initDB() {
    try {
        DBHelper dbHelper1 = new DBHelper(MyApplication.getInstance(),  "wsy.db", null);
        SQLiteDatabase db1 = dbHelper1.getWritableDatabase();
        DaoMaster daoMaster1 = new DaoMaster(db1);
        mDaoSessionN = daoMaster1.newSession();
        if (User.getKey() == null || TextUtils.isEmpty(User.getUid()))
            return;
        DBHelper dbHelper = new DBHelper(MyApplication.getInstance(), User.getUid() + ".db", null);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        mDaoSession = daoMaster.newSession();
    }catch (Exception e){
        e.printStackTrace();
    }
}

然后在App启动的时候调用这个封装好的方法就可以了
这里数据库连接属于DaoMaster,所以多个session指的是相同数据库的连接
通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
第四步,增删改查的操作:

/**
 * 添加、更改本地用户
 */
public static void addUser(Login.DataBean loginData) {
    if (mDaoSessionN==null || loginData==null)
        return;
    UserEntityDao userDao = mDaoSessionN.getUserEntityDao();
    UserEntity userEntity = userDao.queryBuilder()
            .where(UserEntityDao.Properties.Uid.eq(loginData.getUid()))
            .build().unique();
    if (userEntity == null) {
        userEntity = new UserEntity(null,String.valueOf(loginData.getUid()),loginData.getEmail(),loginData.getPhone(),loginData.getAvatar(),loginData.getNick(),
                loginData.getParent_rid(),loginData.getUsername(),loginData.getAccess_token(),
                loginData.getInvalid_time(),loginData.getLogintime(),loginData.getRid(),loginData.getLogintype(),loginData.loginTimeSelf);
        userDao.insert(userEntity);
    } else {
        userEntity = new UserEntity(userEntity.getId(),String.valueOf(loginData.getUid()),loginData.getEmail(),loginData.getPhone(),loginData.getAvatar(),loginData.getNick(),
                loginData.getParent_rid(),loginData.getUsername(),loginData.getAccess_token(),
                loginData.getInvalid_time(),loginData.getLogintime(),loginData.getRid(),loginData.getLogintype(),loginData.loginTimeSelf);
        userDao.update(userEntity);
    }
    // 保留5条记录
    List<UserEntity> allEntities = userDao.queryBuilder()
            .orderDesc(UserEntityDao.Properties.LoginTimeSelf)
            .build().list();
    if (allEntities!=null && allEntities.size()>5) {
        for (int i=5;i<allEntities.size();i++) {
            userDao.delete(allEntities.get(i));
        }
    }
}
/**
 * 删除本地用户
 */
public static void deleteUser(String uid) {
    if (mDaoSessionN==null || TextUtils.isEmpty(uid))
        return;
    UserEntityDao dao = mDaoSessionN.getUserEntityDao();
    UserEntity userEntity = dao.queryBuilder()
            .where(UserEntityDao.Properties.Uid.eq(uid))
            .build().unique();
    if (userEntity == null)
        return;
    dao.delete(userEntity);
}
/**
 * 获取所有本地用户
 */
public static List<Login.DataBean> getUseOrderByTime(int limitNum) {
    List<Login.DataBean> userList = new ArrayList<>();
    if (mDaoSessionN == null)
        return userList;
    UserEntityDao dao = mDaoSessionN.getUserEntityDao();

    QueryBuilder<UserEntity> queryBuilder = dao.queryBuilder()
            .orderDesc(UserEntityDao.Properties.LoginTimeSelf)
            .offset(0)
            .limit(limitNum);
    if (User.getUser()!=null && !TextUtils.isEmpty(User.getUid())) {
        queryBuilder = queryBuilder.where(UserEntityDao.Properties.Uid.notEq(User.getUid()));
    }
    List<UserEntity> userEntities = queryBuilder.build().list();
    if (userEntities!=null && userEntities.size()!=0) {
        for (UserEntity userEntity : userEntities) {
            Login.DataBean dataBean = new Login.DataBean(Integer.parseInt(userEntity.getUid()), userEntity.getEmail(),
                    userEntity.getPhone(), userEntity.getAccess_token(), userEntity.getInvalid_time(),
                    userEntity.getRid(), userEntity.getLogintime(),userEntity.getParent_rid(),userEntity.getAvatar(),
                    userEntity.getNick(),
                    userEntity.getUsername(),userEntity.getLogintype());
            userList.add(dataBean);
        }
    }
    return userList;
}

最后附带一下greendao用到的注解:
(一) @Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(二) @Id
(三) @NotNull 不为null
(四) @Unique 唯一约束
(五) @ToMany 一对多
(六) @OrderBy 排序
(七) @ToOne 一对一
(八) @Transient 不存储在数据库中
(九) @generated 由greendao产生的构造函数或方法

本文地址:https://blog.csdn.net/qq_39681405/article/details/85991343