Android多文件断点续传(二)——实现数据库储存下载信息

上一篇中我们主要介绍了数据的封装和界面的简单实现,如果你还没阅读过,建议先阅读上一篇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 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 getThreads(String url) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from thread_info where url = ?",new String[]{url});
        List 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;
    }
}

我们创建了ThreadDaoImpl来实现ThreadDao接口,通过DBHelper获取到可写或可读的数据库来实现增删查改,这里需要注意的是在写的操作方法上都加上了同步锁,目的还是一样为了避免在多线程情况下数据库读取的过程中出现问题,另外还需要注意的就是SQL的语句不要写错了。

处理完成数据库后,接着就是实现断点续传了,欢迎阅读下一篇。

Android多文件断点续传(三)——实现文件断点续传

你可能感兴趣的:(断点续传)