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. */

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
rInfoDao.insertOrReplace(info);

  1. }

  2. /**

  3. * 查运动信息

  4. */

  5. public static List SearchSportInfo(UserInfo userInfo)

  6. {

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

  8. }

  9. /**

  10. * 查用户信息

  11. */

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-D0nN5lNh-1714788612501)]

[外链图片转存中…(img-i0pWlu3k-1714788612502)]

[外链图片转存中…(img-tQX66egT-1714788612503)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值