package cn.koolcloud.ipos.appstore.download.database;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import cn.koolcloud.ipos.appstore.download.entity.DownloadBean;
/**
* <p>Title: DownloadDBOperator.java </p>
* <p>Description: Class for accessing sqlite by download tasks </p>
* <p> this class include all kinds of operating methods to call database, make sure close the db at the end
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: All In Pay</p>
* @author Teddy
* @date 2013-12-5
* @version
*/
public class DownloadDBOperator {
private final static String TAG = "DownloadDBOperator";
private static DownloadDBOperator instance = null;
private DownloadDBHelper dbHelper;
public static DownloadDBOperator getInstance(Context context) {
if (instance == null) {
instance = new DownloadDBOperator(context);
}
return instance;
}
public DownloadDBOperator(Context context) {
dbHelper = new DownloadDBHelper(context);
}
/**
* close database
*/
public void closeDb() {
dbHelper.close();
}
// ========download table operations=========
/**
* 1.insert one row information
*
* @param beans
*/
public void addDownloadTask(ArrayList<DownloadBean> beans) {
try {
SQLiteDatabase database = dbHelper.getWritableDatabase();
for (DownloadBean bean : beans) {
String sql = "insert into download_info(url, file_name, total_size, start_pos, end_pos, compelete_size,"
+ " thread_id, file_version, file_version_code, package_name, icon_url, soft_id, download_id, version_code) values "
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
Object[] bindArgs = { bean.url, bean.fileName, bean.fileSize,
bean.startPosition, bean.endPosition, bean.currentPosition,
bean.threadId, bean.fileVersion, bean.fileVersionCode,
bean.packageName, bean.iconUrl, bean.fileId, bean.downloadId, bean.versionCode };
database.execSQL(sql, bindArgs);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 2.delete one row
*
* @param url
*/
public boolean deleteDownloadTaskByUrl(String url, String downloadId) {
boolean isSuccess = false;
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
isSuccess = database.delete("download_info", "url=? and download_id=?", new String[] { url, downloadId }) > 0;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return isSuccess;
}
/**
* 3.search if it is exist
*
* @param urlstr
* @return
*/
public boolean isHasDownloadTaskByUrl(String urlstr, String downloadId) {
int count = 0;
Cursor cursor = null;
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select count(*) from download_info where url=? and download_id=?";
cursor = database.rawQuery(sql, new String[] { urlstr, downloadId });
cursor.moveToFirst();
count = cursor.getInt(0);
} catch (Exception e) {
Log.e(TAG, "isHasTask Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return count != 0;
}
/**
* 4.searching by url
*
* @param urlstr
* @return
*/
public ArrayList<DownloadBean> getDownloadTaskByUrl(String urlstr, String downloadId) {
ArrayList<DownloadBean> list = new ArrayList<DownloadBean>();
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select url, file_name, total_size, " +
"start_pos, end_pos, compelete_size, " +
"thread_id, file_version, file_version_code, " +
"package_name, icon_url, soft_id, download_id, version_code " +
"from download_info " +
"where url=? and download_id=?";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, new String[] { urlstr, downloadId });
while (cursor.moveToNext()) {
DownloadBean info = new DownloadBean();
info.url = cursor.getString(0);
info.fileName = cursor.getString(1);
info.fileSize = cursor.getLong(2);
info.startPosition = cursor.getLong(3);
info.endPosition = cursor.getLong(4);
info.currentPosition = cursor.getLong(5);
info.threadId = cursor.getInt(6);
info.fileVersion = cursor.getString(7);
info.fileVersionCode = cursor.getInt(8);
info.packageName = cursor.getString(9);
info.iconUrl = cursor.getString(10);
info.fileId = cursor.getString(11);
info.downloadId = cursor.getString(12);
info.versionCode = cursor.getInt(13);
list.add(info);
}
} catch (Exception e) {
Log.e(TAG, "getDownloadTaskByUrl Error:" + e);
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return list;
}
/**
* 5.search all results <url,bean>
*
* @return
*/
public HashMap<String, ArrayList<DownloadBean>> getAllTasks() {
HashMap<String, ArrayList<DownloadBean>> map = new HashMap<String, ArrayList<DownloadBean>>();
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select url, file_name, " +
"total_size, start_pos, end_pos, " +
"compelete_size, thread_id, file_version, " +
"file_version_code, package_name, " +
"icon_url, soft_id, download_id, version_code " +
"from download_info";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, null);
while (cursor.moveToNext()) {
DownloadBean info = new DownloadBean();
info.url = cursor.getString(0);
info.fileName = cursor.getString(1);
info.fileSize = cursor.getLong(2);
info.startPosition = cursor.getLong(3);
info.endPosition = cursor.getLong(4);
info.currentPosition = cursor.getLong(5);
info.threadId = cursor.getInt(6);
info.fileVersion = cursor.getString(7);
info.fileVersionCode = cursor.getInt(8);
info.packageName = cursor.getString(9);
info.iconUrl = cursor.getString(10);
info.fileId = cursor.getString(11);
info.downloadId = cursor.getString(12);
info.versionCode = cursor.getInt(13);
// update the list, contains by Map
String mapKey = info.url + "_" + info.downloadId;
if (map.containsKey(mapKey)) {
map.get(mapKey).add(info);
} else {// not exist in the map, create a new one
ArrayList<DownloadBean> list = new ArrayList<DownloadBean>();
list.add(info);
map.put(mapKey, list);
}
}
} catch (Exception e) {
Log.e(TAG, "getAllTasks Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return map;
}
/**
* 6.modify the progress for the thread
*
* @param threadId
* @param compeleteSize
* @param urlStr
*/
public void updateTaskCompleteSize(int threadId, long compeleteSize,
String urlStr, String downloadId) {
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "update download_info set compelete_size=? " +
"where thread_id=? and url=? and download_id=?";
Object[] bindArgs = { compeleteSize, threadId, urlStr, downloadId };
database.execSQL(sql, bindArgs);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 6.5. modify the size of saved fiel
* create a new record in database with file size(0), when download task added to list,
* update the record after got file size from server, begin to start when file size > 0
* @param threadId
* @param compeleteSize
* @param urlstr
*/
public void updateTaskCompleteSize(ArrayList<DownloadBean> beans,
String urlstr) {
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
for (DownloadBean bean : beans) {
String sql = "update download_info set total_size=?, start_pos=?, end_pos=? " +
"where url=? and thread_id=? and download_id=?";
Object[] bindArgs = { bean.fileSize, bean.startPosition,
bean.endPosition, bean.url, bean.threadId, bean.downloadId };
database.execSQL(sql, bindArgs);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 7.get download progress
* return -1 when it is not exist on searching
* return -1 when get the file size = 0
* @param urlStr
* @return
*/
public int getTaskProgressByUrl(String urlStr, String downloadId) {
long tmpCompSize = 0;
long fileSize = -1;
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select compelete_size,total_size from download_info where url=? and download_id=?";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, new String[] { urlStr, downloadId });
while (cursor.moveToNext()) {
tmpCompSize += cursor.getLong(0);
long tmpFileSize = cursor.getLong(1);
if (tmpFileSize > fileSize) {
fileSize = tmpFileSize;
}
}
} catch (Exception e) {
Log.e(TAG, "getTaskProgressByUrl Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
if (fileSize < 1) {
tmpCompSize = -1;// Error
} else {
tmpCompSize = tmpCompSize * 100 / fileSize;
}
return (int) tmpCompSize;
}
// ========Pause table operations=========
/**
* 1.insert one record
*
* @param url
* @param packageName
* @param softId
*/
public void addPauseFile(String url, String packageName, String softId, String downloadId) {
try {
SQLiteDatabase database = dbHelper.getWritableDatabase();
String sql = "insert into pause_download_info(url, package_name, soft_id, download_id) " +
"values (?,?,?,?)";
Object[] bindArgs = { url, packageName, softId, downloadId };
database.execSQL(sql, bindArgs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @Title: clearDownloadDataBaseTables
* @Description: clear download database
* @return: void
*/
public void cleanDownloadDataBaseTables() {
try {
SQLiteDatabase database = dbHelper.getWritableDatabase();
String downloadInfoSql = "delete from download_info";
String downloadPauseInfoSql = "delete from pause_download_info";
String downloadEndSql = "delete from end_download_info";
database.execSQL(downloadEndSql);
database.execSQL(downloadInfoSql);
database.execSQL(downloadPauseInfoSql);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 2.delete
* @param url
*/
public boolean removePauseFileByUrl(String url, String downloadId) {
boolean isSuccess = false;
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
isSuccess = database.delete("pause_download_info", "url=? and download_id=?",
new String[] { url, downloadId }) > 0;
} catch (Exception e) {
e.printStackTrace();
}
return isSuccess;
}
/**
* 3. search if it is exist
* @param url
* @return
*/
public boolean isPauseFile(String url, String downloadId) {
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select soft_id from pause_download_info where url=? and download_id=?";
Cursor cursor = null;
boolean flag = false;
try {
cursor = database.rawQuery(sql, new String[] { url, downloadId });
flag = cursor.moveToNext();
} catch (Exception e) {
Log.e(TAG, "removePauseFileByUrl Error:" + e);
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return flag;
}
// ========Complete table operations=========
/**
* 1.insert records
* @param info
*/
public void addCompleteTask(DownloadBean info) {
try {
SQLiteDatabase database = dbHelper.getWritableDatabase();
String sql = "insert into end_download_info(url, file_name," +
" file_size, done_time, icon_url, file_version," +
" file_version_code, package_name," +
" file_path, soft_id, download_id, version_code) values (?,?,?,?,?,?,?,?,?,?,?,?)";
Object[] bindArgs = { info.url, info.fileName, info.fileSize,
info.doneTime, info.iconUrl, info.fileVersion,
info.fileVersionCode, info.packageName, info.savePath,
info.fileId, info.downloadId, info.versionCode };
database.execSQL(sql, bindArgs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 2.delete
* @param url
*/
public boolean deleteCompleteTaskByUrl(String url, String downloadId) {
boolean isSuccess = false;
try {
SQLiteDatabase database = dbHelper.getReadableDatabase();
isSuccess = database.delete("end_download_info", "url=? and download_id=?",
new String[] { url, downloadId }) > 0;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return isSuccess;
}
/**
* 3.search if it is exist
* @param url
* @return
*/
public boolean isTaskDone(String url, String downloadId) {
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select soft_id from end_download_info where url=? and download_id=?";
boolean flag = false;
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, new String[] { url, downloadId });
flag = cursor.moveToNext();
} catch (Exception e) {
Log.e(TAG, "isTaskDone Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return flag;
}
/**
* 4.search by url
*
* @param urlstr
* @return
*/
public DownloadBean getCompleteTaskInfoByUrl(String urlstr, String downloadId) {
DownloadBean info = new DownloadBean();
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select url, file_name, file_size, " +
"done_time, icon_url, file_version, " +
"file_version_code, package_name, " +
"file_path, soft_id, download_id, version_code " +
"from end_download_info " +
"where url=? and download_id=?";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, new String[] { urlstr, downloadId });
while (cursor.moveToNext()) {
info.url = cursor.getString(0);
info.fileName = cursor.getString(1);
info.fileSize = cursor.getLong(2);
info.doneTime = cursor.getLong(3);
info.iconUrl = cursor.getString(4);
info.fileVersion = cursor.getString(5);
info.fileVersionCode = cursor.getInt(6);
info.packageName = cursor.getString(7);
info.savePath = cursor.getString(8);
info.fileId = cursor.getString(9);
info.downloadId = cursor.getString(10);
info.versionCode = cursor.getInt(11);
}
} catch (Exception e) {
Log.e(TAG, "getCompleteTaskInfoByUrl Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return info;
}
/**
* 5.search all
*
* @return
*/
public List<DownloadBean> getAllCompletedTask() {
List<DownloadBean> list = new ArrayList<DownloadBean>();
SQLiteDatabase database = dbHelper.getReadableDatabase();
String sql = "select url, file_name, file_size, " +
"done_time, icon_url, file_version, " +
"file_version_code, package_name, " +
"file_path, soft_id, download_id, version_code " +
"from end_download_info order by done_time asc";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, null);
while (cursor.moveToNext()) {
DownloadBean info = new DownloadBean();
info.url = cursor.getString(0);
info.fileName = cursor.getString(1);
info.fileSize = cursor.getLong(2);
info.doneTime = cursor.getLong(3);
info.iconUrl = cursor.getString(4);
info.fileVersion = cursor.getString(5);
info.fileVersionCode = cursor.getInt(6);
info.packageName = cursor.getString(7);
info.savePath = cursor.getString(8);
info.fileId = cursor.getString(9);
info.downloadId = cursor.getString(10);
info.versionCode = cursor.getInt(11);
list.add(info);
}
} catch (Exception e) {
Log.e(TAG, "getAllComplieteTask Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return list;
}
/**
* @Title: getAppDownloadPathByPackage
* @Description: get path after download the app by package
* @param packageName
* @return
* @return: String
*/
public String getAppDownloadPathByPackage(String packageName) {
SQLiteDatabase database = dbHelper.getReadableDatabase();
String path = "";
String sql = "select file_path, file_name, " +
"done_time, file_version_code, " +
"package_name, version_code " +
"from end_download_info " +
"where package_name = ? order by done_time desc limit 1";
Cursor cursor = null;
try {
cursor = database.rawQuery(sql, new String[] { packageName });
while (cursor.moveToNext()) {
path = cursor.getString(0);
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "getAppDownloadPathByPackage Error:" + e);
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
}
}