概述

接着上回的说,虽然我们已经找出了阻挡我们通用化Android数据库操作的五个问题,但是现在我们还不能立即开始去解决这些问题。

试想一下,我们有一个News,那么,相应的就会有NewsDao和NewsDaoImpl,同理,如果出现一个Book,是不是也要写出BookDao和BookDaoImpl? 这个问题想想就觉得太疯狂!

这里的BookDao等等都是假想的,和NewsDao是一样的东西,就不在复制黏贴一遍了。(偷笑中….)

那么,在解决五个问题之前我们需要做的工作就是,把NewsDao和BookDao中公共的部分在提取一次;把NewsDaoImpl和BookDaoImpl中的公共部分也再提取一次。

去年一滴相思泪,今年刚流到腮边

工作需要一步一步做,那么我们首先抽取NewsDao和BookDao接口中公共的部分,并放在BaseDao中。既然是抽取公共的,那么原先位于NewsDao中,传入特定的参数(如:Integer、News)可能就不在适用了,我们需要寻找更为一般、通用的东西来替代,而泛型就是我们的好帮手(O(∩_∩)O~)。

public interface BaseDao {

/** * 增加 */

long insert(M m);

/** * 删除< * 传入的参数可能或是Integer或者Long或者String, * 那么此处就不能够使用具有特殊性的类型,要使用具有一般性的、公共的。< * 而Serizlizable,则是Integer、Long、String共性的不二选择。 */

int delete(Serializable id);

/** * 修改 */

int update(M m);

/** * 查询所有 */

List findAll();

}

是不是很简单?

我们把公用的方法抽取到BaseDao中,并把参数替换成为泛型和Serializable,这样NewsDao只需要继承我们的BaseDao并传入泛型,就大功告成了。代码如下:

public interface NewsDao extends BaseDao {

// 既然提取完公共的了,那么这些具有特殊性的就不需要了

// 另外,实现BaseDao接口

// long insert(News news);

// int delete(int id);

// int update(News news);

// List findAll();

// 当然,除了通用的增删改查,还具有一些特有的方法

// 比如,查询按时间排序的最新的新闻

}

是不是这个样子?NewsDao里面空空如也,当然,如果我们需要一些更为特殊的方法,还是需要写在这里面的,例如:查询按时间排序的最新的新闻。

问君能有几多愁?恰似一江春水向东流

既然接口中的公共的方法能够抽取,那么它们的实现类也是不能够例外的。我们抽取实现类(NewsDaoImpl和BookDaoImpl)中公共的部分,放在BaseDaoSupport中。

这里要记住BaseDao和BaseDaoSupport之间,只不过是NewsDao和NewsDaoImpl的映射,它们之间也是实现类的关系。

public abstract class BaseDaoSupport implements BaseDao {

// * 抽取公共部分应该解决的问题:

// * 问题1:表名的获取

// * 问题2:如何将实体中的数据,按照对应关系导入到数据库中

// * 问题3:明确实体中主键是谁?获取到主键中封装的值

// * 问题4:实体的对象创建

// * 问题5:如何将数据库中表的列的数据,按照对应关系,封装到实体中

private Context context;

private DBHelper helper;

private SQLiteDatabase db;

public BaseDaoSupport(Context context) {

super();

this.context = context;

this.helper = new DBHelper(context);

this.db = helper.getWritableDatabase();

}

@Override

public long insert(M m) {

// 请在此处填写代码

return 0;

}

@Override

public int delete(Serializable id) {

// 请在此处填写代码

return 0;

}

@Override

public int update(M m) {

// 请在此处填写代码

return 0;

}

@Override

public List findAll() {

// 请在此处填写代码

return null;

}

}

我们来看一下BaseDaoSupport中的东西,我们抽取出了Context、DBHelper、SQLiteOpenHelper还有构造函数,看起来和我们的NewsDaoImpl中的东西一样。

再看看下面的insert、delete、update、findAll等方法,模子是一样的,只不过里面具体的参数替换成了泛型。

回过头我们看看被抽取完的NewsDaoImpl变成什么样子了,首先继承了BaseDaoSupport并传入了自己所要操作的实体bean,然后又实现了NewsDao接口。代码如下:

public class NewsDaoImpl extends BaseDaoSupport implements NewsDao {

public NewsDaoImpl(Context context) {

super(context);

}

}

好像除了构造函数就空空如野了,但实际情况并非如此,我们在BaseDaoSupport中,已经实现了BaseBase接口,并且重写了insert、update、delete、findAll等方法,这样我们NewsDaoImple中就继承了这些公共的方法了。

到了这一步是不是很开心! O(∩_∩)O~ ,代码看着越来越清爽了!

衣带渐宽终不悔,为伊消得人憔悴

到了这一步,我们的抽取和重构就基本完成了,那么我们接下来的工作重点就位于BaseDaoSupport,只要我们能够在此类中解决上一篇文章中碰到的五个问题,那么我们就可以做到Android中数据库的通用操作了。

是不是有点小激动了!! 别着急,我们慢慢来,请看下回分解!

最后把重构完成后的包结构展示给大家:

如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间——很短的一点儿时间。 —— 王尔德

android数据库三个方法有哪些,如何将Android数据库操作通用化(二)相关推荐

  1. android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...

    Android应用开发离不开对SQLite数据库的操作,一般简单的增删改查,可以直接通过SQLiteDatabase进行,但是只要操作变得频繁,并且随着需求不断增加,你应该考虑使用ORM框架,至少使用 ...

  2. java连接MySQL几种方法_Java连接MySQL数据库三种方法

    好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...

  3. DataTable数据批量写入数据库三种方法比较

    DataTable数据批量写入数据库三种方法比较 标签: it 分类: C# 1)   insert循环插入: 2)   sqldataadapter.update(dataset,tablename ...

  4. 如何将Android数据库操作通用化(四)

    概述 明窗半掩小庭幽夜静灯残未待留 风冷结阴寒落叶别离长倚望高楼 迟迟月影斜依竹叠叠诗余赋旅愁 将欲断肠随断梦雁飞连阵几声秋 概述 上一篇文章,已经解决了前两个问题,那么现在我们继续. 首先,我们回顾 ...

  5. 流量节省模式 Android,这三种方法让你节省更多手机上网流量

    大多数手机用户应该都知道最基本的流量管理方式--没有Wi-Fi可用时就不看视频.不玩在线游戏.或者下载大型应用--除非你拥有不限流量套餐.但如果你在使用流量时已经很节约,但每个月的用量依然会超出流量套 ...

  6. PG数据库版本查看方法,sql语句查pg数据库版本方法

    PG 数据库和 oracle 数据库的查看数据库版本的 sql 语句还不一样. PG 数据库版本查看方法如下: select version() 演示效果图: 喜欢的点个赞❤吧!

  7. Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件

    出品 | 滴滴技术 作者 | 江义旺 前言:近日,滴滴发布的开源项目 DroidAssist ,提供了一种简单易用.无侵入.配置化.轻量级的 Java 字节码操作方式,只需要在 XML 配置中添加简单 ...

  8. datagridview控件读写mysql数据库表格的方法_c# datagridview表格控件常用操作

    1) 行右键菜单 private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { ...

  9. 数据库:MySQL(单表的表记录的操作)(二)

    一.表记录的增删改查 1.增加表记录 <1>插入一条记录:insert [into] tab_name (field1,filed2,.......) values (value1,val ...

最新文章

  1. java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
  2. 7. Leetcode 611. 有效三角形的个数 (数组-双向双指针)
  3. .net core 监听性能,异常
  4. markdown学习/mou
  5. python开发环境anaconda3_Python环境管理(Anaconda3)
  6. 搭建 Harbor 1.10.6 高可用集群
  7. 【Matlab故障诊断分析】BP神经网络三相逆变器故障诊断研究【含源码 1736期】
  8. 文明4 java_文明4主题曲《Baba Yetu》(敬请关注中文歌词部分~)
  9. Linux基础知识篇二
  10. hexo更换icarus主题和美化
  11. Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架
  12. 任务驱动在中职计算机课中的应用,论任务驱动教学法在中职计算机基础课上的应用...
  13. 新款自助机存在的故障隐患及解决方法
  14. DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验
  15. linux版本kettle 中文乱码,kettle工具同步数据乱码-Linux下乱码问题二
  16. ajax的leiku,AJAX实现汉字和拼音搜索自动提示的效果(asp.net)
  17. 《计算机网络》第三章作业
  18. 简单聊聊分布式系统架构
  19. 详解:批处理框架_Spring Batch
  20. 不是计算机专业可以报名系统集成项目管理工程师吗

热门文章

  1. R语言ggplot2可视化:使用ggpubr包的text_grob函数和as_ggplot函数可视化文本段落(将指定文本段落可视化出来、指定文本段可视化为图像)
  2. sql获取group by最后一条记录
  3. 关闭office提示:为什么要冒险,获取正版office
  4. 可以参考的前端网站(提高审美和创新)
  5. 告别最好用的微软UWP应用OneNote 微软已经开始将其替换为Win32版
  6. 随想,产品思维和开发思维
  7. Python_楼梯数计算
  8. 1001. 害死人不偿命的(3n+1)猜想 (15)
  9. go语言打印日期_ZEBRA打印机前置USB 直连扫描枪打印
  10. 关于一个lo接口IPv6 unreachable路由的细节