上面罗列知识点的时候,说到了权限,如果手机系统是6.0 以上的要获取权限即请求用户允许的那种,否则会出现android.system.ErrnoException: open failed: EACCES (Permission denied)异常,下面代码中涉及权限的就是模拟一下,具体逻辑没有严格的去实现,大家看的时候需要注意。。
package com.example.a_0102.mylearn.download; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.ProgressBar; import com.example.a_0102.mylearn.R; import java.util.ArrayList; import java.util.List; /** ?* 断点续传 ?* 一个文件可以分成几部分,使用不同的线程进行下载,使用数据库存储每个线程的下载进度 ?*/ public class DownLoadActivity extends AppCompatActivity { ? ? private ListView mListView; ? ? private List<FileInfo> fileInfoList; ? ? private ListViewAdapter adapter; ? ? private UpdateUIReceiver mUpdateUIReceiver; ? ? private DownLoadTaskImpl downLoadTask; ? ? private Button mBtnDel; ? ? private Intent intent; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_down_load); ? ? ? ? //申请权限 ? ? ? ? if (ContextCompat.checkSelfPermission(DownLoadActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ? ? ? ? ? ? //没有权限 ? ? ? ? ? ? Log.e("------------->", "没有权限"); ? ? ? ? ? ? ActivityCompat.requestPermissions(DownLoadActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); ? ? ? ? } else { ? ? ? ? ? ? Log.e("------------->", "已经有权限"); ? ? ? ? } ? ? ? ? mBtnDel = findViewById(R.id.btn_del); ? ? ? ? downLoadTask = new DownLoadTaskImpl(this); ?? ??? ?//从数据库获取要下载的文件 ? ? ? ? fileInfoList = new ArrayList<>(); ? ? ? ? fileInfoList = downLoadTask.getFileInfo(); ? ? ? ? //这里是用来模拟,具体请按照需求来写 ? ? ? ? if (fileInfoList.size() == 0) { ? ? ? ? ? ? FileInfo fileInfo1 = new FileInfo(0, "http://oslw24znh.bkt.clouddn.com/android2017_07_05.apk", "xiaobang.apk", 0, 0, 0); ? ? ? ? ? ? FileInfo fileInfo2 = new FileInfo(1, "http://ofmudsqae.bkt.clouddn.com/%E5%91%A8%E5%86%AC%E9%9B%A8%20-%20%E4%B8%8D%E5%AE%8C%E7%BE%8E%E5%A5%B3%E5%AD%A9.mp3", "buwanmei.mp3", 0, 0, 0); ? ? ? ? ? ? fileInfoList.add(fileInfo1); ? ? ? ? ? ? fileInfoList.add(fileInfo2); ? ? ? ? } ? ? ? ? mListView = findViewById(R.id.listview); ? ? ? ? adapter = new ListViewAdapter(); ? ? ? ? mListView.setAdapter(adapter); ?? ??? ?//为了测试写的,可忽略 ? ? ? ? mBtnDel.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onClick(View v) { ? ? ? ? ? ? ? ? Log.e("------------>","dddsize:"+downLoadTask.getFileInfo().size()); ? ? ? ? ? ? ? ? downLoadTask.deleteFileInfo(); ? ? ? ? ? ? ? ? Log.e("------------>","size:"+downLoadTask.getFileInfo().size()); ? ? ? ? ? ? ? ? downLoadTask.deleteThreadInfo(); ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? //申请权限的回调 ?? ?@Override ? ? public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { ? ? ? ? super.onRequestPermissionsResult(requestCode, permissions, grantResults); ? ? ? ? Log.e("------------->", "requestCode:" + requestCode + "," + permissions[0]); ? ? ? ? if (requestCode == 0) { ? ? ? ? ? ? if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ ? ? ? ? ? ? ? ? Log.e("------------->", "授权被允许" ); ? ? ? ? ? ? }else { ? ? ? ? ? ? ? ? Log.e("------------->", "授权没有被允许" ); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? @Override ? ? protected void onResume() { ? ? ? ? super.onResume(); ? ? ? ? // 1. 实例化BroadcastReceiver子类 & ?IntentFilter ? ? ? ? mUpdateUIReceiver = new UpdateUIReceiver(); ? ? ? ? IntentFilter intentFilter = new IntentFilter(); ? ? ? ? // 2. 设置接收广播的类型 ? ? ? ? intentFilter.addAction("UPDATE_PROGRESSBAR"); ? ? ? ? // 3. 动态注册:调用Context的registerReceiver()方法 ? ? ? ? registerReceiver(mUpdateUIReceiver, intentFilter); ? ? } ? ? // 注册广播后,要在相应位置记得销毁广播 // 即在onPause() 中unregisterReceiver(mBroadcastReceiver) // 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中 // 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。 ? ? @Override ? ? protected void onPause() { ? ? ? ? super.onPause(); ? ? ? ? //销毁在onResume()方法中的广播 ? ? ? ? unregisterReceiver(mUpdateUIReceiver); ? ? } ? ? @Override ? ? protected void onDestroy() { ? ? ? ? super.onDestroy(); ? ? ? ? if (intent == null) { ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? stopService(intent); ? ? } ? ? private class ListViewAdapter extends BaseAdapter { ? ? ? ? @Override ? ? ? ? public int getCount() { ? ? ? ? ? ? return fileInfoList.size(); ? ? ? ? } ? ? ? ? @Override ? ? ? ? public Object getItem(int position) { ? ? ? ? ? ? return fileInfoList.get(position); ? ? ? ? } ? ? ? ? @Override ? ? ? ? public long getItemId(int position) { ? ? ? ? ? ? return position; ? ? ? ? } ? ? ? ? @Override ? ? ? ? public View getView(final int position, View convertView, ViewGroup parent) { ? ? ? ? ? ? ViewHolder viewHolder = null; ? ? ? ? ? ? if (convertView == null) { ? ? ? ? ? ? ? ? convertView = LayoutInflater.from(DownLoadActivity.this).inflate(R.layout.layout_down_item, parent, false); ? ? ? ? ? ? ? ? viewHolder = new ViewHolder(); ? ? ? ? ? ? ? ? viewHolder.mProgress = convertView.findViewById(R.id.progress); ? ? ? ? ? ? ? ? viewHolder.mBtnDown = convertView.findViewById(R.id.btn_down); ? ? ? ? ? ? ? ? viewHolder.mBtnStop = convertView.findViewById(R.id.btn_stop); ? ? ? ? ? ? ? ? convertView.setTag(viewHolder); ? ? ? ? ? ? ? ? //不用更新的尽量写在这里,防止每次都调用,进度设置为100 ? ? ? ? ? ? ? ? viewHolder.mProgress.setMax(100); ? ? ? ? ? ? ? ? viewHolder.mBtnDown.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? ? ? public void onClick(View v) { ? ? ? ? ? ? ? ? ? ? ? ? intent = new Intent(DownLoadActivity.this, DownLoadService.class); ? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("status", DownLoadService.STATUS_START); ? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("fileinfo", fileInfoList.get(position)); ? ? ? ? ? ? ? ? ? ? ? ? startService(intent); ? ? ? ? ? ? ? ? ? ? ? ? if (!downLoadTask.isExitFileInfo(fileInfoList.get(position).getId())) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? downLoadTask.insertFileInfo(fileInfoList.get(position)); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? }); ? ? ? ? ? ? ? ? viewHolder.mBtnStop.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? ? ? public void onClick(View v) { ? ? ? ? ? ? ? ? ? ? ? ? intent = new Intent(DownLoadActivity.this, DownLoadService.class); ? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("status", DownLoadService.STATUS_STOP); ? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("fileinfo", fileInfoList.get(position)); ? ? ? ? ? ? ? ? ? ? ? ? startService(intent); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? }); ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? viewHolder = (ViewHolder) convertView.getTag(); ? ? ? ? ? ? } ? ? ? ? ? ? FileInfo fileInfo = fileInfoList.get(position); ? ? ? ? ? ? viewHolder.mProgress.setProgress(fileInfo.getProgress()); ? ? ? ? ? ? return convertView; ? ? ? ? } ? ? ? ? class ViewHolder { ? ? ? ? ? ? private ProgressBar mProgress; ? ? ? ? ? ? private Button mBtnDown; ? ? ? ? ? ? private Button mBtnStop; ? ? ? ? } ? ? } ? ? /** ? ? ?* 用于更新UI的广播 ? ? ?* 使用静态注册的广播,广播的类如果是内部类,那么,该类必须为static修饰的类,否则has no zero argument constructor 这个异常 ? ? ?* https://blog.csdn.net/zhongjianblackberry/article/details/56670084 ? ? ?* 或者用动态注册广播 ? ? ?*/ ? ? public class UpdateUIReceiver extends BroadcastReceiver { ? ? ? ? @Override ? ? ? ? public void onReceive(Context context, Intent intent) { ? ? ? ? ? ? if (intent.getAction().equals("UPDATE_PROGRESSBAR")) { ? ? ? ? ? ? ? ? int id = intent.getIntExtra("id", 0); ? ? ? ? ? ? ? ? int finished = intent.getIntExtra("finished", 0); ? ? ? ? ? ? ? ? int length = intent.getIntExtra("length", 0); ? ? ? ? ? ? ? ? if (length == 0 || length < 0) { ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? int progress = finished * 100 / length; ? ? ? ? ? ? ? ? FileInfo fileInfo = fileInfoList.get(id); ? ? ? ? ? ? ? ? fileInfo.setFinished(finished); ? ? ? ? ? ? ? ? fileInfo.setLength(length); ? ? ? ? ? ? ? ? fileInfo.setProgress(progress); ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? downLoadTask.updateFileInfo(fileInfo, id); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
4、接下来是文件类和线程类的代码
public class FileInfo implements Serializable { ? ? private int id; ? ? private String url;//文件的URL ? ? private String file_name;//文件名称 ? ? private int progress;//当前进度(显示在进度条上的) ? ? private int finished;//已下载完的(实际下载的大小) ? ? private int length;//文件的大小 ? ? public FileInfo() { ? ? } ? ? public FileInfo(int id, String url, String file_name, int progress, int finished, int length) { ? ? ? ? this.id = id; ? ? ? ? this.url = url; ? ? ? ? this.file_name = file_name; ? ? ? ? this.progress = progress; ? ? ? ? this.finished = finished; ? ? ? ? this.length = length; ? ? } ? ? public int getId() { ? ? ? ? return id; ? ? } ? ? public void setId(int id) { ? ? ? ? this.id = id; ? ? } ? ? public String getUrl() { ? ? ? ? return url; ? ? } ? ? public void setUrl(String url) { ? ? ? ? this.url = url; ? ? } ? ? public String getFile_name() { ? ? ? ? return file_name; ? ? } ? ? public void setFile_name(String file_name) { ? ? ? ? this.file_name = file_name; ? ? } ? ? public int getProgress() { ? ? ? ? return progress; ? ? } ? ? public void setProgress(int progress) { ? ? ? ? this.progress = progress; ? ? } ? ? public int getLength() { ? ? ? ? return length; ? ? } ? ? public void setLength(int length) { ? ? ? ? this.length = length; ? ? } ? ? public int getFinished() { ? ? ? ? return finished; ? ? } ? ? public void setFinished(int finished) { ? ? ? ? this.finished = finished; ? ? } ? ? @Override ? ? public String toString() { ? ? ? ? return "FileInfo{" + ? ? ? ? ? ? ? ? "id=" + id + ? ? ? ? ? ? ? ? ", url='" + url + '\'' + ? ? ? ? ? ? ? ? ", file_name='" + file_name + '\'' + ? ? ? ? ? ? ? ? ", progress=" + progress + ? ? ? ? ? ? ? ? ", finished=" + finished + ? ? ? ? ? ? ? ? ", length=" + length + ? ? ? ? ? ? ? ? '}'; ? ? } }
public class ThreadInfo implements Serializable { ? ? private int id;//主键自增 ? ? private int thread_id;//如果没有id,唯一的标识,多线程的时候就不知道更新哪个了 ? ? private String url; ? ? private long start_flag; ? ? private long end_flag; ? ? private long finished;//该线程的下载进度 ? ? public ThreadInfo() { ? ? } ? ? public ThreadInfo(int thread_id, String url, long start_flag, long end_flag, long finished) { ? ? ? ? this.thread_id = thread_id; ? ? ? ? this.url = url; ? ? ? ? this.start_flag = start_flag; ? ? ? ? this.end_flag = end_flag; ? ? ? ? this.finished = finished; ? ? } ? ? public int getId() { ? ? ? ? return id; ? ? } ? ? public void setId(int id) { ? ? ? ? this.id = id; ? ? } ? ? public int getThread_id() { ? ? ? ? return thread_id; ? ? } ? ? public void setThread_id(int thread_id) { ? ? ? ? this.thread_id = thread_id; ? ? } ? ? public String getUrl() { ? ? ? ? return url; ? ? } ? ? public void setUrl(String url) { ? ? ? ? this.url = url; ? ? } ? ? public long getStart_flag() { ? ? ? ? return start_flag; ? ? } ? ? public void setStart_flag(long start_flag) { ? ? ? ? this.start_flag = start_flag; ? ? } ? ? public long getEnd_flag() { ? ? ? ? return end_flag; ? ? } ? ? public void setEnd_flag(long end_flag) { ? ? ? ? this.end_flag = end_flag; ? ? } ? ? public long getFinished() { ? ? ? ? return finished; ? ? } ? ? public void setFinished(long finished) { ? ? ? ? this.finished = finished; ? ? } ? ? @Override ? ? public String toString() { ? ? ? ? return "ThreadInfo{" + ? ? ? ? ? ? ? ? "id=" + id + ? ? ? ? ? ? ? ? ", thread_id=" + thread_id + ? ? ? ? ? ? ? ? ", url='" + url + '\'' + ? ? ? ? ? ? ? ? ", start_flag=" + start_flag + ? ? ? ? ? ? ? ? ", end_flag=" + end_flag + ? ? ? ? ? ? ? ? ", finished=" + finished + ? ? ? ? ? ? ? ? '}'; ? ? } }
5、数据库的代码
这里要用单例模式,否则会报错
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** ?* 要用单例的,否则会出现Cannot perform this operation because the connection pool has been closed ?*/ public class DbHalper extends SQLiteOpenHelper { ? ? private static final String DB_NAME = "downloadfile"; ? ? private static final int DB_VERSION = 1; ? ? private static final String CREATE_THREAD_INFO = "create table thread_info (id integer primary key autoincrement,thread_id int,url text ,start_flag int,end_flag int,finished int);"; ? ? private static final String CREATE_FILE_INFO = "create table file_info (id integer primary key,url text ,file_name text,length int,progress int,finished int);"; ? ? private static DbHalper dbHalper; ? ? public static DbHalper getDbHalper(Context context){ ? ? ? ? if(dbHalper == null){ ? ? ? ? ? ? dbHalper = new DbHalper(context); ? ? ? ? } ? ? ? ? return dbHalper; ? ? } ? ? private DbHalper(Context context) { ? ? ? ? super(context, DB_NAME, null, DB_VERSION); ? ? } ? ? @Override ? ? public void onCreate(SQLiteDatabase db) { ? ? ? ? db.execSQL(CREATE_THREAD_INFO); ? ? ? ? db.execSQL(CREATE_FILE_INFO); ? ? } ? ? @Override ? ? public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { ? ? } }
public interface IDownLoadTask { ? ? /** ? ? ?* 插入线程信息 ? ? ?* ? ? ?* @param threadInfo ? ? ?*/ ? ? void insertThreadInfo(ThreadInfo threadInfo); ? ? /** ? ? ?* 更新线程信息 ? ? ?* ? ? ?* @param threadInfo ? ? ?* @param id ? ? ?*/ ? ? void updateThreadInfo(ThreadInfo threadInfo, int id, String url); ? ? /** ? ? ?* 删除下载完成的线程记录 ? ? ?* ? ? ?* @param url ? ? ?*/ ? ? void deleteThreadInfo(String url); ? ? /** ? ? ?* 获取所有线程信息 ? ? ?* ? ? ?* @param url ? ? ?* @return ? ? ?*/ ? ? List<ThreadInfo> getThreadInfos(String url); ? ? /** ? ? ?* 获取所有线程信息 ? ? ?* ? ? ?* @return ? ? ?*/ ? ? List<ThreadInfo> getThreadInfos(); ? ? /** ? ? ?* 插入文件信息 ? ? ?* ? ? ?* @param fileInfo ? ? ?*/ ? ? void insertFileInfo(FileInfo fileInfo); ? ? /** ? ? ?* 修改文件的信息 ? ? ?* ? ? ?* @param fileInfo ? ? ?* @param id ? ? ?*/ ? ? void updateFileInfo(FileInfo fileInfo, int id); ? ? /** ? ? ?* 该文件信息是否存在 ? ? ?* ? ? ?* @param id ? ? ?* @return ? ? ?*/ ? ? boolean isExitFileInfo(int id); ? ? /** ? ? ?* 查询文件信息 ? ? ?* ? ? ?* @return ? ? ?*/ ? ? List<FileInfo> getFileInfo(); ? ? /** ? ? ?* 删除文件信息 ? ? ?*/ ? ? void deleteFileInfo(); ? ? /** ? ? ?* 删除文件下载的线程信息 ? ? ?*/ ? ? void deleteThreadInfo(); }
接口类的实现,注意同步,否则多个线程一起操作一个方法会出现“惊喜“
import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; /** ?* 增、删、改方法要保证线程安全,同一时刻只能有一个线程访问 ?*/ public class DownLoadTaskImpl implements IDownLoadTask { ? ? private DbHalper dbHalper; ? ? private SQLiteDatabase db; ? ? public DownLoadTaskImpl(Context context) { ? ? ? ? dbHalper = DbHalper.getDbHalper(context); ? ? } ? ? @Override ? ? public synchronized void insertThreadInfo(ThreadInfo threadInfo) { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("insert into thread_info (thread_id,url,start_flag,end_flag,finished) values (?,?,?,?,?);", ? ? ? ? ? ? ? ? new Object[]{threadInfo.getThread_id(),threadInfo.getUrl(),threadInfo.getStart_flag(), ? ? ? ? ? ? ? ? ? ? ? ? threadInfo.getEnd_flag(),threadInfo.getFinished()}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public synchronized void updateThreadInfo(ThreadInfo threadInfo, int thread_id,String url) { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("update thread_info set thread_id=?, url=?,start_flag=?,end_flag=?,finished=? ?where thread_id = ? and url = ?;", ? ? ? ? ? ? ? ? new Object[]{threadInfo.getThread_id(),threadInfo.getUrl(), threadInfo.getStart_flag(), ? ? ? ? ? ? ? ? ? ? ? ? threadInfo.getEnd_flag(),threadInfo.getFinished(),thread_id,url}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public synchronized void deleteThreadInfo(String url) { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("delete from thread_info where url=?;",new String[]{url}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public List<ThreadInfo> getThreadInfos(String url) { ? ? ? ? ? ? List<ThreadInfo> threadInfos = new ArrayList<>(); ? ? ? ? ? ? SQLiteDatabase db = dbHalper.getReadableDatabase(); ? ? ? ? ? ? Cursor cursor = db.rawQuery("select * from thread_info where url=?;",new String[]{url}); ? ? ? ? ? ? while (cursor.moveToNext()){ ? ? ? ? ? ? ? ? ThreadInfo threadInfo = new ThreadInfo(); ? ? ? ? ? ? ? ? threadInfo.setThread_id(cursor.getInt(cursor.getColumnIndex("thread_id"))); ? ? ? ? ? ? ? ? threadInfo.setUrl(cursor.getString(cursor.getColumnIndex("url"))); ? ? ? ? ? ? ? ? threadInfo.setStart_flag(cursor.getInt(cursor.getColumnIndex("start_flag"))); ? ? ? ? ? ? ? ? threadInfo.setEnd_flag(cursor.getInt(cursor.getColumnIndex("end_flag"))); ? ? ? ? ? ? ? ? threadInfo.setFinished(cursor.getInt(cursor.getColumnIndex("finished"))); ? ? ? ? ? ? ? ? threadInfos.add(threadInfo); ? ? ? ? ? ? } ? ? ? ? ? ? cursor.close(); ? ? ? ? ? ? db.close(); ? ? ? ? ? ? return threadInfos; ? ? ? ? } ? ? @Override ? ? public List<ThreadInfo> getThreadInfos() { ? ? ? ? List<ThreadInfo> threadInfos = new ArrayList<>(); ? ? ? ? SQLiteDatabase db = dbHalper.getReadableDatabase(); ? ? ? ? Cursor cursor = db.rawQuery("select * from thread_info;",new String[]{}); ? ? ? ? while (cursor.moveToNext()){ ? ? ? ? ? ? ThreadInfo threadInfo = new ThreadInfo(); ? ? ? ? ? ? threadInfo.setThread_id(cursor.getInt(cursor.getColumnIndex("thread_id"))); ? ? ? ? ? ? threadInfo.setUrl(cursor.getString(cursor.getColumnIndex("url"))); ? ? ? ? ? ? threadInfo.setStart_flag(cursor.getInt(cursor.getColumnIndex("start_flag"))); ? ? ? ? ? ? threadInfo.setEnd_flag(cursor.getInt(cursor.getColumnIndex("end_flag"))); ? ? ? ? ? ? threadInfo.setFinished(cursor.getInt(cursor.getColumnIndex("finished"))); ? ? ? ? ? ? threadInfos.add(threadInfo); ? ? ? ? } ? ? ? ? cursor.close(); ? ? ? ? db.close(); ? ? ? ? return threadInfos; ? ? } ? ? @Override ? ? public synchronized void insertFileInfo(FileInfo fileInfo) { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("replace into file_info (id,url,file_name,length,progress,finished) values (?,?,?,?,?,?);", ? ? ? ? ? ? ? ? new Object[]{fileInfo.getId(),fileInfo.getUrl(),fileInfo.getFile_name(),fileInfo.getLength(), ? ? ? ? ? ? ? ? ? ? ? ? fileInfo.getProgress(),fileInfo.getFinished()}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public synchronized void updateFileInfo(FileInfo fileInfo, int id) { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("update file_info set id=?, url=?,file_name=?,length=?,progress=?,finished=? ?where id = ?;", ? ? ? ? ? ? ? ? new Object[]{fileInfo.getId(),fileInfo.getUrl(), fileInfo.getFile_name(),fileInfo.getLength(), ? ? ? ? ? ? ? ? ? ? ? ? fileInfo.getProgress(),fileInfo.getFinished(),id}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public boolean isExitFileInfo(int id) { ? ? ? ? SQLiteDatabase db = dbHalper.getReadableDatabase(); ? ? ? ? boolean isExit = false; ? ? ? ? Cursor cursor = db.rawQuery("select * from file_info where id=?;",new String[]{id+""}); ? ? ? ? while (cursor.moveToNext()){ ? ? ? ? ? ? isExit = true; ? ? ? ? } ? ? ? ? cursor.close(); ? ? ? ? db.close(); ? ? ? ? return isExit; ? ? } ? ? @Override ? ? public List<FileInfo> getFileInfo() { ? ? ? ? List<FileInfo> fileInfos = new ArrayList<>(); ? ? ? ? SQLiteDatabase db = dbHalper.getReadableDatabase(); ? ? ? ? Cursor cursor = db.rawQuery("select * from file_info;",new String[]{}); ? ? ? ? while (cursor.moveToNext()){ ? ? ? ? ? ? FileInfo fileInfo = new FileInfo(); ? ? ? ? ? ? fileInfo.setId(cursor.getInt(cursor.getColumnIndex("id"))); ? ? ? ? ? ? fileInfo.setUrl(cursor.getString(cursor.getColumnIndex("url"))); ? ? ? ? ? ? fileInfo.setFile_name(cursor.getString(cursor.getColumnIndex("file_name"))); ? ? ? ? ? ? fileInfo.setLength(cursor.getInt(cursor.getColumnIndex("length"))); ? ? ? ? ? ? fileInfo.setProgress(cursor.getInt(cursor.getColumnIndex("progress"))); ? ? ? ? ? ? fileInfo.setFinished(cursor.getInt(cursor.getColumnIndex("finished"))); ? ? ? ? ? ? fileInfos.add(fileInfo); ? ? ? ? } ? ? ? ? cursor.close(); ? ? ? ? db.close(); ? ? ? ? return fileInfos; ? ? } ? ? @Override ? ? public synchronized void deleteFileInfo() { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("delete from file_info;",new String[]{}); ? ? ? ? db.close(); ? ? } ? ? @Override ? ? public void deleteThreadInfo() { ? ? ? ? SQLiteDatabase db = dbHalper.getWritableDatabase(); ? ? ? ? db.execSQL("delete from thread_info;",new String[]{}); ? ? ? ? db.close(); ? ? } }
提示:可以直接使用FileDownloader一个开源的下载大文件的框架,使用就自行百度吧
标签:SQLite
相关阅读 >>
intellj idea 2020版添加Sqlite数据库的方法
如何通过android stduio来编写一个完整的天气预报app
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。