上一篇中我们主要介绍了数据的封装和界面的简单实现,如果你还没阅读过,建议先阅读上一篇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;    }}

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

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

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

更多相关文章

  1. Android中,在C++层使用TinyXML解析XML文件
  2. Android清单文件详解(四) ---- backupAgent的用法
  3. Android工程中R.java文件的重新生成——(注意资源文件的错误)
  4. Android多线程下载远程图片
  5. Mac上非常好用的免费的Android文件传输工具
  6. Android 数据库对比
  7. Android遍历获取Office格式(Word,Excel,PPT,PDF)的文件并打开

随机推荐

  1. android studio运行项目安装到手机上失败
  2. ScrollView嵌套RecycleView相关问题
  3. Android程序优化之异常终止数据恢复
  4. Android异步更新UI的方式之使用Handler消
  5. Android(安卓)WebView 常见的九个问题
  6. AS(android studio) 添加第三方库时报,Err
  7. 初学Android的一些注意事项
  8. android 手机UDP 接受不到数据
  9. Android应用程序获取system权限
  10. 安卓修改屏幕超时后,系统不进入休眠的方法