设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] 自己封装的Android sqlite-helper.jar包使用方法

[复制链接]

尚未签到

发表于 2016-12-1 09:34:40 | 显示全部楼层 |阅读模式
在Android项目开发中会经常使用到其内嵌的SQLite数据库,但是疲于Android本身的SQLiteOpenHelper的繁琐(也许个人从事过Web开发,惯用MySql的偏见),经过统一思想的 方式封装了该sqlite-helper.jar包,对于从Java Web方向转过来的人也许算是一种帮助吧!
1.新建实体类

package com.whl.helper.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class DownloadInfo {
@JsonIgnore(value=true)
private int id;
private int threadId;// 下载器id
private int startPos;// 开始点
private int endPos;// 结束点
private int completeSize;// 完成度
private String downloadUrl;// 下载器网络标识
private int finish;//下载完成(0:未完成,1:已完成)
public DownloadInfo(){}
public DownloadInfo(int threadId, int startPos, int endPos,int completeSize, String downloadUrl) {
super();
this.threadId = threadId;
this.startPos = startPos;
this.endPos = endPos;
this.completeSize = completeSize;
this.downloadUrl = downloadUrl;
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public int getThreadId() {
return threadId;
}
public void setThreadId(int threadId) {
this.threadId = threadId;
}
public int getStartPos() {
return startPos;
}
public void setStartPos(int startPos) {
this.startPos = startPos;
}
public int getEndPos() {
return endPos;
}
public void setEndPos(int endPos) {
this.endPos = endPos;
}
public int getCompleteSize() {
return completeSize;
}
public void setCompleteSize(int completeSize) {
this.completeSize = completeSize;
}
public String getDownloadUrl() {
return downloadUrl;
}
public void setDownloadUrl(String downloadUrl) {
this.downloadUrl = downloadUrl;
}
public int getFinish() {
return finish;
}
public void setFinish(int finish) {
this.finish = finish;
}
@Override
public String toString() {
return "DownloadInfo [id=" + id + ", threadId=" + threadId
+ ", startPos=" + startPos + ", endPos=" + endPos
+ ", completeSize=" + completeSize + ", downloadUrl="
+ downloadUrl + ", finish=" + finish + "]";
}
}


2.该实体类的Dao接口

package com.whl.helper.database.dao;
import java.util.List;
import com.whl.dao.common.BaseDao;
import com.whl.dao.common.DaoException;
import com.whl.helper.entity.DownloadInfo;
public interface DownloadInfoDao extends BaseDao<DownloadInfo> {
public Boolean isHasDownloadInfosWithDownloadUrl(String downloadUrl) throws DaoException;
public List<DownloadInfo> findDownloadInfoListWithDownloadUrl(String downloadUrl) throws DaoException;
public int deleteDownloadInfoWithDownloadUrl(String downloadUrl) throws DaoException;
public int update(int completeSize,int threadId,String downloadUrl) throws DaoException;
public DownloadInfo findDownloadInfoWithThreadIdAndDownloadUrl(int threadId, String downloadUrl) throws DaoException;
public long findDownloadInfoSumCompleteSizeWithDownloadUrl(String downloadUrl) throws DaoException;
}


3.该实体类的Dao接口实现类

package com.whl.helper.database.dao.impl;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import com.whl.dao.common.DaoException;
import com.whl.dao.impl.CreateBaseDaoImpl;
import com.whl.helper.database.dao.DownloadInfoDao;
import com.whl.helper.entity.DownloadInfo;
import com.whl.utils.RowMapper;
public class DownloadInfoDaoImpl extends CreateBaseDaoImpl<DownloadInfo> implements DownloadInfoDao {
public DownloadInfoDaoImpl(Context context){
super.prepare(context, new RowMapper<DownloadInfo>() {
@Override
public DownloadInfo onRowMapper(Cursor cursor) {
DownloadInfo downloadInfo = new DownloadInfo();
downloadInfo.setId(cursor.getInt(cursor.getColumnIndex("id")));
downloadInfo.setCompleteSize(cursor.getInt(cursor.getColumnIndex("completeSize")));
downloadInfo.setDownloadUrl(cursor.getString(cursor.getColumnIndex("downloadUrl")));
downloadInfo.setEndPos(cursor.getInt(cursor.getColumnIndex("endPos")));
downloadInfo.setStartPos(cursor.getInt(cursor.getColumnIndex("startPos")));
downloadInfo.setThreadId(cursor.getInt(cursor.getColumnIndex("threadId")));
downloadInfo.setFinish(cursor.getInt(cursor.getColumnIndex("finish")));
return downloadInfo;
}
});
}
@Override
public Boolean isHasDownloadInfosWithDownloadUrl(String downloadUrl) throws DaoException {
String sql = "SELECT COUNT(*) AS size FROM downloadInfo WHERE downloadUrl = ?";
String[] values = {downloadUrl};
return super.countSqlResult(sql, values)==0?true:false;
}
@Override
public List<DownloadInfo> findDownloadInfoListWithDownloadUrl(String downloadUrl) throws DaoException {
String sql = "SELECT * FROM downloadInfo WHERE downloadUrl = ?";
String[] values = {downloadUrl};
//List<DownloadInfo> downloadInfoList = super.find(sql, values);
return super.find(sql, values);
}
@Override
public int deleteDownloadInfoWithDownloadUrl(String downloadUrl)throws DaoException {
String sql = "DELETE FROM downloadInfo WHERE downloadUrl = ?";
String[] values = {downloadUrl};
return super.deleteUnique(sql, values);
}
@Override
public int update(int completeSize,int threadId,String downloadUrl) throws DaoException {
String sql = "UPDATE downloadInfo SET completeSize = ? WHERE threadId=? AND downloadUrl = ?";
String[] values = {String.valueOf(completeSize),String.valueOf(threadId),downloadUrl};
return super.batchExecute(sql, values);
}
@Override
public DownloadInfo findDownloadInfoWithThreadIdAndDownloadUrl(int threadId, String downloadUrl) throws DaoException{
String sql = "SELECT * FROM downloadInfo WHERE threadId = ? AND downloadUrl = ?";
String[] values = {String.valueOf(threadId),downloadUrl};
return super.findUniqueResult(sql, values);
}
@Override
public long findDownloadInfoSumCompleteSizeWithDownloadUrl(String downloadUrl) throws DaoException {
long sumCompletedSize = 0;
List<DownloadInfo> downloadInfoList = findDownloadInfoListWithDownloadUrl(downloadUrl);
for (DownloadInfo downloadInfo : downloadInfoList) {
sumCompletedSize+=downloadInfo.getCompleteSize();
}
return sumCompletedSize;
}
}


4.该实体类的Service类

package com.whl.helper.database.service;
import java.util.List;
import android.content.Context;
import com.whl.dao.common.DaoException;
import com.whl.helper.database.dao.DownloadInfoDao;
import com.whl.helper.database.dao.impl.DownloadInfoDaoImpl;
import com.whl.helper.entity.DownloadInfo;
import com.whl.service.common.BaseService;
public class DownloadInfoService extends BaseService<DownloadInfo> {
private DownloadInfoDao downloadInfoDao;
private static DownloadInfoService downloadInfoServiceInstance;
private DownloadInfoService(Context context){
downloadInfoDao = new DownloadInfoDaoImpl(context);
super.prepareBaseDao(downloadInfoDao);
}
public static DownloadInfoService getInstance(Context context){
if(downloadInfoServiceInstance==null){
downloadInfoServiceInstance = new DownloadInfoService(context);
}
return downloadInfoServiceInstance;
}
public Boolean isHasDownloadInfosWithDownloadUrl(String downloadUrl){
try {
return downloadInfoDao.isHasDownloadInfosWithDownloadUrl(downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return false;
}
}
public List<DownloadInfo> findDownloadInfoListWithDownloadUrl(String downloadUrl){
try {
return downloadInfoDao.findDownloadInfoListWithDownloadUrl(downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return null;
}
}
public int deleteDownloadInfoWithDownloadUrl(String downloadUrl){
try {
return downloadInfoDao.deleteDownloadInfoWithDownloadUrl(downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return 0;
}
}
public int update(int completeSize,int threadId,String downloadUrl){
try {
return downloadInfoDao.update(completeSize,threadId, downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return 0;
}
}
public DownloadInfo findDownloadInfoWithThreadIdAndDownloadUrl(int threadId, String downloadUrl){
try {
return downloadInfoDao.findDownloadInfoWithThreadIdAndDownloadUrl(threadId, downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return null;
}
}
public long findDownloadInfoSumCompleteSizeWithDownloadUrl(String downloadUrl){
try {
return downloadInfoDao.findDownloadInfoSumCompleteSizeWithDownloadUrl(downloadUrl);
} catch (DaoException e) {
e.printStackTrace();
return 0;
}
}
}


当然,对于习惯写SQL语句的人来说这种方式很容易理解,jar中基本上已经封装好了常用的增删改查,特殊处理的地方也就是如上书写SQL语句并传递参数并调用响应的基本方法即可。
5.真正使用
做完上述基本工作以后接下来就是如何去使用,使用其实很简单,首先如果是新建的数据库就需要SQL语句:

/**
* 初始化数据库
*/
public void initDatabase(String[] sqlArray){
CreateDatabaseHelper createDatabaseHelper = CreateDatabaseHelper.getInstanceDatabaseHelper(getApplicationContext());
SQLiteDatabase database = createDatabaseHelper.getWritableDatabase();
database.beginTransaction();
for (String sql : sqlArray) {
database.execSQL(sql);
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
}


接着就是其他的一些操作只需获取响应实体类的Service对象:

public void testSqliteStatement(){
DownloadInfoService downloadInfoService = DownloadInfoService.getInstance(this);
try {
long startTime = System.currentTimeMillis();
DownloadInfo downloadInfo = downloadInfoService.get("2");
downloadInfoService.removeUnique(downloadInfo);
long finishTime = System.currentTimeMillis();
Log.d(TAG, "testSqliteStatement:"+(finishTime-startTime));
} catch (DaoException e) {
e.printStackTrace();
}
/*List<DownloadInfo> downloadInfoList = new ArrayList<DownloadInfo>();
for(int i=0;i<2;i++){
DownloadInfo downloadInfo = new DownloadInfo();
downloadInfo.setCompleteSize(1000+i);
downloadInfo.setDownloadUrl("www"+i);
downloadInfo.setEndPos(2000+i);
downloadInfo.setFinish(0+i);
downloadInfo.setStartPos(0+i);
downloadInfo.setThreadId(11+i);
downloadInfoList.add(downloadInfo);
}

try {
long startTime = System.currentTimeMillis();
for (DownloadInfo downloadInfo : downloadInfoList) {
downloadInfoService.insert(downloadInfo);
}
long finishTime = System.currentTimeMillis();
Log.d(TAG, "testSqliteStatement:"+(finishTime-startTime));
} catch (DaoException e) {
e.printStackTrace();
}*/
}


这里需要说明的是实体类的属性名必须与数据库表中的字段名一样(虽然不区分大小写),实体名也与对应的数据表名一样(虽然不区分大小写),否则会报异常,这样的好处是方便明白意义。上述只是创建了一个数据表,该表的SQL语句如下:

CREATE TABLE IF NOT EXISTS downloadInfo(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, threadId INTEGER, startPos INTEGER, endPos INTEGER, completeSize INTEGER,downloadUrl VARCHAR,finish INTEGER)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308030-1-1.html 上篇帖子: Android Sqlite数据库版本升级管理初探 下篇帖子: SQLite剖析(10):异步IO模式、共享缓存模式和解锁通知
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表