android数据库三个方法有哪些,如何将Android数据库操作通用化(二)
概述
接着上回的说,虽然我们已经找出了阻挡我们通用化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数据库操作通用化(二)相关推荐
- android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...
Android应用开发离不开对SQLite数据库的操作,一般简单的增删改查,可以直接通过SQLiteDatabase进行,但是只要操作变得频繁,并且随着需求不断增加,你应该考虑使用ORM框架,至少使用 ...
- java连接MySQL几种方法_Java连接MySQL数据库三种方法
好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...
- DataTable数据批量写入数据库三种方法比较
DataTable数据批量写入数据库三种方法比较 标签: it 分类: C# 1) insert循环插入: 2) sqldataadapter.update(dataset,tablename ...
- 如何将Android数据库操作通用化(四)
概述 明窗半掩小庭幽夜静灯残未待留 风冷结阴寒落叶别离长倚望高楼 迟迟月影斜依竹叠叠诗余赋旅愁 将欲断肠随断梦雁飞连阵几声秋 概述 上一篇文章,已经解决了前两个问题,那么现在我们继续. 首先,我们回顾 ...
- 流量节省模式 Android,这三种方法让你节省更多手机上网流量
大多数手机用户应该都知道最基本的流量管理方式--没有Wi-Fi可用时就不看视频.不玩在线游戏.或者下载大型应用--除非你拥有不限流量套餐.但如果你在使用流量时已经很节约,但每个月的用量依然会超出流量套 ...
- PG数据库版本查看方法,sql语句查pg数据库版本方法
PG 数据库和 oracle 数据库的查看数据库版本的 sql 语句还不一样. PG 数据库版本查看方法如下: select version() 演示效果图: 喜欢的点个赞❤吧!
- Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件
出品 | 滴滴技术 作者 | 江义旺 前言:近日,滴滴发布的开源项目 DroidAssist ,提供了一种简单易用.无侵入.配置化.轻量级的 Java 字节码操作方式,只需要在 XML 配置中添加简单 ...
- datagridview控件读写mysql数据库表格的方法_c# datagridview表格控件常用操作
1) 行右键菜单 private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { ...
- 数据库:MySQL(单表的表记录的操作)(二)
一.表记录的增删改查 1.增加表记录 <1>插入一条记录:insert [into] tab_name (field1,filed2,.......) values (value1,val ...
最新文章
- java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- 7. Leetcode 611. 有效三角形的个数 (数组-双向双指针)
- .net core 监听性能,异常
- markdown学习/mou
- python开发环境anaconda3_Python环境管理(Anaconda3)
- 搭建 Harbor 1.10.6 高可用集群
- 【Matlab故障诊断分析】BP神经网络三相逆变器故障诊断研究【含源码 1736期】
- 文明4 java_文明4主题曲《Baba Yetu》(敬请关注中文歌词部分~)
- Linux基础知识篇二
- hexo更换icarus主题和美化
- Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架
- 任务驱动在中职计算机课中的应用,论任务驱动教学法在中职计算机基础课上的应用...
- 新款自助机存在的故障隐患及解决方法
- DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验
- linux版本kettle 中文乱码,kettle工具同步数据乱码-Linux下乱码问题二
- ajax的leiku,AJAX实现汉字和拼音搜索自动提示的效果(asp.net)
- 《计算机网络》第三章作业
- 简单聊聊分布式系统架构
- 详解:批处理框架_Spring Batch
- 不是计算机专业可以报名系统集成项目管理工程师吗
热门文章
- R语言ggplot2可视化:使用ggpubr包的text_grob函数和as_ggplot函数可视化文本段落(将指定文本段落可视化出来、指定文本段可视化为图像)
- sql获取group by最后一条记录
- 关闭office提示:为什么要冒险,获取正版office
- 可以参考的前端网站(提高审美和创新)
- 告别最好用的微软UWP应用OneNote 微软已经开始将其替换为Win32版
- 随想,产品思维和开发思维
- Python_楼梯数计算
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- go语言打印日期_ZEBRA打印机前置USB 直连扫描枪打印
- 关于一个lo接口IPv6 unreachable路由的细节