版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1533588867/article/details/53129774
上一篇中我们主要介绍了数据的封装和界面的简单实现,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(一)——数据封装以及界面实现。接着我们还需要先将数据库准备好,这里用了Android自带的SQLite,对SQLite的使用一般都可以按照固定模版来实现的,具体接着往下看。
一.创建DBHelper
/**
* Created by kun on 2016/11/10.
*/
public class DBHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "download.db";
private static DBHelper dbHelper = null;
public static DBHelper getInstance(Context context){
if(dbHelper==null) dbHelper = new DBHelper(context);
return dbHelper;
}
private DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table thread_info (_id integer primary key autoincrement," +
"thread_id integer,url text,start integer,end integer,finished integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
由于我们要实现的功能是多文件并且分段下载的功能,因此会涉及到多线程,为了避免在数据库读取的过程中出现问题,在这里我们就使用单例模式创建DBHelper 。
上面代码中我们创建了一个名为download.db的数据库,并在其中创建了一张表thread_info,里面的字段有_id ,thread_id ,url ,start ,end , finished。用于保存下载线程中的下载信息。
如果对数据库更新有要求的,可以继续实现onUpgrade方法。
二. 定义ThreadDao
/**
* Created by kun on 2016/11/10.
*/
public interface ThreadDao {
/**
* 插入下载线程信息
* @param threadBean
*/
void insertThread(ThreadBean threadBean);
/**
* 更新下载线程信息
* @param url
* @param thread_id
* @param finished
*/
void updateThread(String url ,int thread_id,int finished);
/**
* 删除下载线程
* @param url
*/
void deleteThread(String url);
/**
* 获取下载线程
* @param url
* @return
*/
List<ThreadBean> getThreads(String url);
/**
* 判断下载线程是否存在
* @param url
* @param thread_id
* @return
*/
boolean isExists(String url ,int thread_id);
}
在这里我们定义了一个接口,里面主要有5个方法,具体看注释就可以了。
三.实现ThreadDao
/**
* Created by kun on 2016/11/10.
*/
public class ThreadDaoImpl implements ThreadDao {
private DBHelper dbHelper;
public ThreadDaoImpl(Context context){
dbHelper = DBHelper.getInstance(context);
}
@Override
public synchronized void insertThread(ThreadBean threadBean) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("insert into thread_info ( thread_id, url, start ,end, finished) values (?,?,?,?,?)"
,new Object[]{threadBean.getId(),threadBean.getUrl(),threadBean.getStart(),threadBean.getEnd(),threadBean.getFinished()});
db.close();
}
@Override
public synchronized void updateThread(String url, int thread_id, int finished) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("update thread_info set finished = ? where url = ? and thread_id = ?"
,new Object[]{finished,url,thread_id});
db.close();
}
@Override
public void deleteThread(String url) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from thread_info where url = ?",new Object[]{url});
db.close();
}
@Override
public List<ThreadBean> getThreads(String url) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from thread_info where url = ?",new String[]{url});
List<ThreadBean> threadBeanList = new ArrayList<>();
while (cursor.moveToNext()){
ThreadBean bean = new ThreadBean();
bean.setId(cursor.getInt(cursor.getColumnIndex("thread_id")));
bean.setUrl(cursor.getString(cursor.getColumnIndex("url")));
bean.setStart(cursor.getInt(cursor.getColumnIndex("start")));
bean.setEnd(cursor.getInt(cursor.getColumnIndex("end")));
bean.setFinished(cursor.getInt(cursor.getColumnIndex("finished")));
threadBeanList.add(bean);
}
cursor.close();
db.close();
return threadBeanList;
}
@Override
public boolean isExists(String url, int thread_id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from thread_info where url = ? and thread_id = ?", new String[]{url,thread_id+""});
boolean exists = cursor.moveToNext();
cursor.close();
db.close();
return exists;
}
}