Android框架之路-GreenDao的使用

[java] view plain copy

print ?

  1. greendao {

  2. schemaVersion 1  //版本

  3. daoPackage ’生成文件包名’ // 一般为app包名+生成文件的文件夹名

  4. targetGenDir ’src/main/java’ //生成文件路径

  5. }

greendao {

schemaVersion 1 //版本

daoPackage ‘生成文件包名’ // 一般为app包名+生成文件的文件夹名

targetGenDir ‘src/main/java’ //生成文件路径

}

4.创建实体类,生成dao文件

[java] view plain copy

print ?

  1. @Entity

  2. public class dayStep {

  3. @Id

  4. private long id;

  5. private String date;

  6. private int step;

  7. private Long sportId;

  8. @ToOne(joinProperty = “ sportId”)

  9. private SportInfo sportInfo;//关系表

  10. }

@Entity

public class dayStep {

@Id

private long id;

private String date;

private int step;

private Long sportId;

@ToOne(joinProperty = " sportId")

private SportInfo sportInfo;//关系表

}

注意:编写完实体类以后在实体类界面下按下Ctrl+F9(Make project),程序会自动编译生成dao文件,生成的文件一共有三个。

Greendao生成文件

5.使用Greendao

(1)创建一个application类,在application中完成DaoSession的初始化,避免以后重复初始化,便于使用。

[java] view plain copy

print ?

  1. public class MyApplication extends Application {

  2. private DaoMaster.DevOpenHelper mHelper;

  3. private SQLiteDatabase db;

  4. private DaoMaster mDaoMaster;

  5. private DaoSession mDaoSession;

  6. //静态单例

  7. public static MyApplication instances;

  8. @Override

  9. public void onCreate() {

  10. super.onCreate();

  11. instances = this;

  12. setDatabase();

  13. }

  14. public static MyApplication getInstances(){

  15. return instances;

  16. }

  17. /**

  18. * 设置greenDao

  19. */

  20. private void setDatabase() {

  21. // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。

  22. // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。

  23. // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。

  24. // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。

  25. mHelper = new DaoMaster.DevOpenHelper(this, “sport-db”, null);

  26. db = mHelper.getWritableDatabase();

  27. // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。

  28. mDaoMaster = new DaoMaster(db);

  29. mDaoSession = mDaoMaster.newSession();

  30. }

  31. public DaoSession getDaoSession() {

  32. return mDaoSession;

  33. }

  34. public SQLiteDatabase getDb() {

  35. return db;

  36. }

  37. }

public class MyApplication extends Application {

private DaoMaster.DevOpenHelper mHelper;

private SQLiteDatabase db;

private DaoMaster mDaoMaster;

private DaoSession mDaoSession;

//静态单例

public static MyApplication instances;

@Override

public void onCreate() {

super.onCreate();

instances = this;

setDatabase();

}

public static MyApplication getInstances(){

return instances;

}

/**

  • 设置greenDao

*/

private void setDatabase() {

// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。

// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。

// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。

// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。

mHelper = new DaoMaster.DevOpenHelper(this, “sport-db”, null);

db = mHelper.getWritableDatabase();

// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。

mDaoMaster = new DaoMaster(db);

mDaoSession = mDaoMaster.newSession();

}

public DaoSession getDaoSession() {

return mDaoSession;

}

public SQLiteDatabase getDb() {

return db;

}

}

(2)Greendao操作数据库文件(增,删,改,查)

[java] view plain copy

print ?

  1. /**

  2. * 增

  3. */

  4. public void insert()

  5. {

  6. String date = new Date().toString();

  7. mDayStep = new dayStep(null,date,0);//第一个是id值,因为是自增长所以不用传入

  8. dao.insert(mDayStep);

  9. }

  10. /**

  11. * 查

  12. */

  13. public void Search()

  14. {

  15. //方法一

  16. List mDayStep = dao.loadAll();

  17. //方法二

  18. //List mDayStep = dao.queryBuilder().list();

  19. //方法三 惰性加载

  20. //List mDayStep = dao.queryBuilder().listLazy();

  21. for (int i = 0; i < mDayStep.size(); i++) {

  22. String date = ”“;

  23. date = mDayStep.get(i).getDate();

  24. Log.d(”cc”, “id:  ”+i+“date:  ”+date);

  25. }

  26. }

  27. /**

  28. * 删

  29. * @param i 删除数据的id

  30. */

  31. public void delete(long i)

  32. {

  33. dao.deleteByKey(i);

  34. //当然Greendao还提供了其他的删除方法,只是传值不同而已

  35. }

  36. /**

  37. *改

  38. * @param i

  39. * @param date

  40. */

  41. public void correct(long i,String date)

  42. {

  43. mDayStep =  new dayStep((long) i,date,0);

  44. dao.update(mDayStep);

  45. }

  46. /**

  47. *修改或者替换(有的话就修改,没有则替换)

  48. */

  49. public void insertOrReplace(long i,String date)

  50. {

  51. mDayStep = new dayStep((long) i,date,0);

  52. dao.insertOrReplace(mDayStep);

  53. }

  54. /**

  55. *查找符合某一字段的所有元素

  56. */

  57. public void searchEveryWhere(String str)

  58. {

  59.  List mList = dao.queryBuilder()

  60. .where(dao.date.eq(str)).build().listLazy();

  61. }

/**

*/

public void insert()

{

String date = new Date().toString();

mDayStep = new dayStep(null,date,0);//第一个是id值,因为是自增长所以不用传入

dao.insert(mDayStep);

}

/**

*/

public void Search()

{

//方法一

List mDayStep = dao.loadAll();

//方法二

//List mDayStep = dao.queryBuilder().list();

//方法三 惰性加载

//List mDayStep = dao.queryBuilder().listLazy();

for (int i = 0; i < mDayStep.size(); i++) {

String date = “”;

date = mDayStep.get(i).getDate();

Log.d(“cc”, "id:  "+i+"date:  "+date);

}

}

/**

  • @param i 删除数据的id

*/

public void delete(long i)

{

dao.deleteByKey(i);

//当然Greendao还提供了其他的删除方法,只是传值不同而已

}

/**

*改

  • @param i

  • @param date

*/

public void correct(long i,String date)

{

mDayStep =  new dayStep((long) i,date,0);

dao.update(mDayStep);

}

/**

*修改或者替换(有的话就修改,没有则替换)

*/

public void insertOrReplace(long i,String date)

{

mDayStep = new dayStep((long) i,date,0);

dao.insertOrReplace(mDayStep);

}

/**

*查找符合某一字段的所有元素

*/

public void searchEveryWhere(String str)

{

List mList = dao.queryBuilder()

.where(dao.date.eq(str)).build().listLazy();

}

===

三、多表关联

======

一对一与一对多概念几乎类似,我们在这里就只做一对多的讲解(我们实现一个用户有多张运动表,运动表就是用户表的儿子表,而用户表则是运动表的父表)

运动表

[java] view plain copy

print ?

  1. @Entity

  2. public class SportInfo {

  3. @Id

  4. private Long sportId;

  5. //日期

  6. private String date = “”;

  7. private Long UserId;

  8. @ToOne(joinProperty = “UserId”)

  9. private UserInfo userInfo;//关系表

  10. }

@Entity

public class SportInfo {

@Id

private Long sportId;

//日期

private String date = “”;

private Long UserId;

@ToOne(joinProperty = “UserId”)

private UserInfo userInfo;//关系表

}

用户表

[java] view plain copy

print ?

  1. @Entity

  2. public class UserInfo {

  3. @Id

  4. private Long id;

  5. //账号

  6. private String number;

  7. //密码

  8. private String password;

  9. //昵称

  10. private String nick_name;

  11. //一对多关联

  12. @ToMany(referencedJoinProperty = “sportId”)

  13. private List sportInfo;

  14. }

@Entity

public class UserInfo {

@Id

private Long id;

//账号

private String number;

//密码

private String password;

//昵称

private String nick_name;

//一对多关联

@ToMany(referencedJoinProperty = “sportId”)

private List sportInfo;

}

多表关联的增删改查(我已封装成了方法方便使用)

[java] view plain copy

print ?

  1. public class DataBaseTool {

  2. private static SportInfoDao mSportInfoDao = MyApplication.getInstances().getDaoSession().getSportInfoDao();

  3. private static UserInfoDao mUserInfoDao = MyApplication.getInstances().getDaoSession().getUserInfoDao();

  4. /**

  5. * 增加运动信息

  6. */

  7. public static long insertSportInfo(UserInfo userInfo,SportInfo sportInfo)

  8. {

  9. sportInfo.setUserId(userInfo.getId());//增加运动表时要指定其父表(用户表id和用户表)

  10. sportInfo.setUserInfo(userInfo);

  11. return mSportInfoDao.insertOrReplace(sportInfo);

  12. }

  13. /**

  14. * 增加用户信息

  15. */

  16. public static long insertUserInfo(UserInfo info)

  17. {

  18. return mUserInfoDao.insertOrReplace(info);

  19. }

  20. /**

  21. * 查运动信息

  22. */

  23. public static List SearchSportInfo(UserInfo userInfo)

  24. {

  25. return userInfo.getSportInfo();//查找运动表则需要通过用户表来获取运动表的集合然后再遍历找到所需运动表

  26. }

  27. /**

  28. * 查用户信息

  29. */

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
26.     {

  1. return userInfo.getSportInfo();//查找运动表则需要通过用户表来获取运动表的集合然后再遍历找到所需运动表

  2. }

  3. /**

  4. * 查用户信息

  5. */

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-SL5pEWns-1715426201747)]

[外链图片转存中…(img-QUzysfsV-1715426201748)]

[外链图片转存中…(img-AAg4o84q-1715426201749)]

[外链图片转存中…(img-9GpkyjyN-1715426201750)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值