From 5de6372579c31f504788a75ceaa0b34688b2c274 Mon Sep 17 00:00:00 2001
From: lyy <511455842@qq.com>
Date: Tue, 4 Oct 2016 19:24:22 +0800
Subject: [PATCH] =?UTF-8?q?=E2=80=9C=E4=BE=8B=E5=AD=90=E7=BC=96=E5=86=99?=
=?UTF-8?q?=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/codeStyleSettings.xml | 4 +-
app/src/main/AndroidManifest.xml | 1 -
.../simple/activity/SimpleTestActivity.java | 58 +++++-
.../arialyy/simple/base/BaseApplication.java | 2 +
.../arialyy/simple/module/DownloadModule.java | 2 +-
.../downloadutil/core/DownloadManager.java | 28 ++-
.../downloadutil/core/DownloadTarget.java | 23 +--
.../com/arialyy/downloadutil/core/Task.java | 19 +-
.../core/command/CommandFactory.java | 5 +
.../core/command/IDownloadCommand.java | 2 +-
.../downloadutil/entity/DownloadEntity.java | 14 +-
.../arialyy/downloadutil/orm/DbEntity.java | 172 +++++------------
.../com/arialyy/downloadutil/orm/DbUtil.java | 182 ++++++++++++------
.../com/arialyy/downloadutil/orm/Ignore.java | 2 +-
.../arialyy/downloadutil/util/SQLHelper.java | 2 +-
15 files changed, 301 insertions(+), 215 deletions(-)
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index e53fdd43..7c259691 100644
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -63,9 +63,7 @@
-
-
-
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0b436785..78078ae4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,7 +5,6 @@
-
{
};
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override public void onReceive(Context context, Intent intent) {
+ long len = 0;
+ @Override public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ switch (action) {
+ case DownloadManager.ACTION_PRE:
+ DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ACTION_PRE);
+ len = entity.getFileSize();
+ L.d(TAG, "download pre");
+ break;
+ case DownloadManager.ACTION_START:
+ L.d(TAG, "download start");
+ break;
+ case DownloadManager.ACTION_RESUME:
+ L.d(TAG, "download resume");
+ break;
+ case DownloadManager.ACTION_RUNNING:
+ long current = intent.getLongExtra(DownloadManager.ACTION_RUNNING, 0);
+ if (len == 0) {
+ mPb.setProgress(0);
+ } else {
+ mPb.setProgress((int) ((current * 100) / len));
+ }
+ break;
+ case DownloadManager.ACTION_STOP:
+ L.d(TAG, "download stop");
+ break;
+ }
}
};
@@ -126,6 +156,21 @@ public class SimpleTestActivity extends BaseActivity {
switch (view.getId()) {
case R.id.start:
start();
+// if (PermissionManager.getInstance()
+// .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+// start();
+// } else {
+// PermissionManager.getInstance()
+// .requestPermission(this, new OnPermissionCallback() {
+// @Override public void onSuccess(String... permissions) {
+// start();
+// }
+//
+// @Override public void onFail(String... permissions) {
+//
+// }
+// }, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+// }
break;
case R.id.stop:
stop();
@@ -136,8 +181,9 @@ public class SimpleTestActivity extends BaseActivity {
}
}
+ DownloadEntity entity = new DownloadEntity();
+
private void start() {
- DownloadEntity entity = new DownloadEntity();
entity.setFileName("test.apk");
entity.setDownloadUrl(mDownloadUrl);
entity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk");
@@ -148,12 +194,14 @@ public class SimpleTestActivity extends BaseActivity {
.createCommand(this, entity, CommandFactory.TASK_START);
commands.add(addCommand);
commands.add(startCommand);
- DownloadManager.getInstance(this).setCommands(commands).exe();
-
+ DownloadManager.getInstance().setCommands(commands).exe();
}
private void stop() {
- mUtil.stopDownload();
+// mUtil.stopDownload();
+ IDownloadCommand stopCommand = CommandFactory.getInstance()
+ .createCommand(this, entity, CommandFactory.TASK_STOP);
+ DownloadManager.getInstance().setCommand(stopCommand).exe();
}
private void cancel() {
diff --git a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
index c497cb97..37a39c84 100644
--- a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
+++ b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
@@ -2,6 +2,7 @@ package com.arialyy.simple.base;
import android.app.Application;
+import com.arialyy.downloadutil.core.DownloadManager;
import com.arialyy.frame.core.AbsFrame;
/**
@@ -11,5 +12,6 @@ public class BaseApplication extends Application {
@Override public void onCreate() {
super.onCreate();
AbsFrame.init(this);
+ DownloadManager.init(this);
}
}
diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
index b4192497..a32b28ea 100644
--- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
+++ b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
@@ -47,7 +47,7 @@ public class DownloadModule extends BaseModule {
*/
public IntentFilter getDownloadFilter(){
IntentFilter filter = new IntentFilter();
- filter.addCategory(getContext().getPackageName());
+ filter.addDataScheme(getContext().getPackageName());
filter.addAction(DownloadManager.ACTION_PRE);
filter.addAction(DownloadManager.ACTION_RESUME);
filter.addAction(DownloadManager.ACTION_START);
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
index 861945f2..254d235a 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
@@ -1,8 +1,11 @@
package com.arialyy.downloadutil.core;
+import android.app.Application;
import android.content.Context;
+import android.util.Log;
import com.arialyy.downloadutil.core.command.IDownloadCommand;
+import com.arialyy.downloadutil.orm.DbUtil;
import java.util.ArrayList;
import java.util.List;
@@ -12,6 +15,7 @@ import java.util.List;
* 下载管理器,通过命令的方式控制下载
*/
public class DownloadManager {
+ private static final String TAG = "DownloadManager";
private static final Object LOCK = new Object();
private static volatile DownloadManager INSTANCE = null;
/**
@@ -74,13 +78,26 @@ public class DownloadManager {
private DownloadManager(Context context) {
mContext = context;
+ DownloadTarget.init(context);
+ DbUtil.init(context);
}
- public static DownloadManager getInstance(Context context) {
- if (INSTANCE == null) {
- synchronized (LOCK) {
- INSTANCE = new DownloadManager(context.getApplicationContext());
+ public static DownloadManager init(Context context) {
+ if (context instanceof Application) {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new DownloadManager(context.getApplicationContext());
+ }
}
+ } else {
+ Log.e(TAG, "Context 只能为application");
+ }
+ return INSTANCE;
+ }
+
+ public static DownloadManager getInstance() {
+ if (INSTANCE == null) {
+ throw new NullPointerException("请在Application中调用init进行下载器注册");
}
return INSTANCE;
}
@@ -88,8 +105,9 @@ public class DownloadManager {
/**
* 设置命令
*/
- public void setCommant(IDownloadCommand command) {
+ public DownloadManager setCommand(IDownloadCommand command) {
mCommands.add(command);
+ return this;
}
/**
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
index 424f1bdb..77d82922 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
@@ -15,7 +15,14 @@ public class DownloadTarget extends IDownloadTarget {
private static volatile DownloadTarget INSTANCE = null;
private Context mContext;
- public static DownloadTarget getInstance(Context context) {
+ public static DownloadTarget getInstance() {
+ if (INSTANCE == null) {
+ throw new NullPointerException("请在Application中调用init进行注册");
+ }
+ return INSTANCE;
+ }
+
+ static DownloadTarget init(Context context) {
if (INSTANCE == null) {
synchronized (LOCK) {
INSTANCE = new DownloadTarget(context.getApplicationContext());
@@ -86,20 +93,14 @@ public class DownloadTarget extends IDownloadTarget {
}
@Override public void removeTask(DownloadEntity entity) {
- Task task = mCachePool.getTask(entity.getDownloadUrl());
+ Task task = mExecutePool.getTask(entity.getDownloadUrl());
if (task != null) {
- Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ?
- "成功" :
- "失败"
- ));
+ Log.d(TAG, "从执行池删除任务,删除" + (mExecutePool.removeTask(task) ? "成功" : "失败"));
} else {
- task = mExecutePool.getTask(entity.getDownloadUrl());
+ task = mCachePool.getTask(entity.getDownloadUrl());
}
if (task != null) {
- Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ?
- "成功" :
- "失败"
- ));
+ Log.d(TAG, "从缓存池删除任务,删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
} else {
Log.w(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的任务");
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
index f6068fbc..42ff4d41 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
@@ -2,6 +2,7 @@ package com.arialyy.downloadutil.core;
import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
import android.os.Handler;
import android.util.Log;
@@ -39,7 +40,7 @@ public class Task {
listener = new DownloadListener(context, downloadEntity, outHandler);
}
util.download(context, downloadEntity.getDownloadUrl(),
- downloadEntity.getDownloadPath(), listener);
+ downloadEntity.getDownloadPath(), listener);
}
}
@@ -86,8 +87,12 @@ public class Task {
this.context = context;
this.outHandler = outHandler;
this.downloadEntity = downloadEntity;
- sendIntent = new Intent();
- sendIntent.addCategory(context.getPackageName());
+ sendIntent = new Intent(DownloadManager.ACTION_RUNNING);
+ Uri.Builder builder = new Uri.Builder();
+ builder.scheme(context.getPackageName());
+ Uri uri = builder.build();
+ sendIntent.setData(uri);
+
}
@Override public void onPreDownload(HttpURLConnection connection) {
@@ -116,6 +121,7 @@ public class Task {
if (currentLocation - lastLen > INTERVAL) { //不要太过于频繁发送广播
sendIntent.putExtra(DownloadManager.ACTION_RUNNING, currentLocation);
lastLen = currentLocation;
+ context.sendBroadcast(sendIntent);
}
}
@@ -162,8 +168,11 @@ public class Task {
private void sendIntent(String action, long location) {
downloadEntity.save();
- Intent intent = new Intent();
- intent.addCategory(context.getPackageName());
+ Uri.Builder builder = new Uri.Builder();
+ builder.scheme(context.getPackageName());
+ Uri uri = builder.build();
+ Intent intent = new Intent(action);
+ intent.setData(uri);
intent.putExtra(action, downloadEntity);
if (location != -1) {
intent.putExtra(DownloadManager.CURRENT_LOCATION, location);
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/CommandFactory.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/CommandFactory.java
index a2ba6471..d9d1cad1 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/CommandFactory.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/CommandFactory.java
@@ -17,6 +17,10 @@ public class CommandFactory {
* 启动任务
*/
public static final int TASK_START = 0x123;
+ /**
+ * 恢复任务
+ */
+ public static final int TASK_RESUME = 0x127;
/**
* 取消任务
*/
@@ -56,6 +60,7 @@ public class CommandFactory {
switch (type) {
case TASK_CREATE:
return createAddCommand(context, entity);
+ case TASK_RESUME:
case TASK_START:
return createStartCommand(context, entity);
case TASK_CANCEL:
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
index 0686c024..06a5a650 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
@@ -24,7 +24,7 @@ public abstract class IDownloadCommand {
if (!CheckHelp.checkDownloadEntity(entity)) {
return;
}
- target = DownloadTarget.getInstance(context);
+ target = DownloadTarget.getInstance();
mContext = context;
mEntity = entity;
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java b/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
index 54abfcf5..d9d88f94 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
@@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.arialyy.downloadutil.orm.DbEntity;
+import com.arialyy.downloadutil.orm.Ignore;
/**
* Created by lyy on 2015/12/25.
@@ -13,30 +14,37 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
/**
* 其它状态
*/
+ @Ignore
public static final int STATE_OTHER = -1;
/**
* 失败状态
*/
+ @Ignore
public static final int STATE_FAIL = 0;
/**
* 完成状态
*/
+ @Ignore
public static final int STATE_COMPLETE = 1;
/**
* 停止状态
*/
+ @Ignore
public static final int STATE_STOP = 2;
/**
* 未开始状态
*/
+ @Ignore
public static final int STATE_WAIT = 3;
/**
* 下载中
*/
+ @Ignore
public static final int STATE_DOWNLOAD_ING = 4;
/**
* 取消下载
*/
+ @Ignore
public static final int STATE_CANCEL = 5;
private String downloadUrl; //下载路径
@@ -50,6 +58,8 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
private long currentProgress = 0; //当前下载进度
private int failNum = 0;
+ public DownloadEntity(){}
+
public String getStr() {
return str;
}
@@ -134,9 +144,6 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
return (DownloadEntity) super.clone();
}
- public DownloadEntity() {
- }
-
@Override public int describeContents() {
return 0;
}
@@ -165,6 +172,7 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
this.failNum = in.readInt();
}
+ @Ignore
public static final Creator CREATOR = new Creator() {
@Override public DownloadEntity createFromParcel(Parcel source) {
return new DownloadEntity(source);
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
index e7292db6..21793b8c 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
@@ -1,17 +1,9 @@
package com.arialyy.downloadutil.orm;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
-import com.arialyy.downloadutil.util.Util;
-
-import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
/**
@@ -19,53 +11,18 @@ import java.util.List;
* 所有数据库实体父类
*/
public class DbEntity {
- private static final String TAG = "DbEntity";
- private volatile static SQLiteDatabase mDb = null;
- private volatile static DbUtil mUtil;
- private Context mContext;
- private static final Object LOCK = new Object();
- protected int rowID = -1;
+ protected int rowID = -1;
+ private DbUtil mUtil = DbUtil.getInstance();
protected DbEntity() {
}
- public DbEntity(Context context) {
- this(context, true);
- }
-
- public DbEntity(Context context, boolean newTable) {
- mContext = context;
- init(newTable);
- }
-
- private void init(boolean newTable) {
- if (mDb == null) {
- synchronized (LOCK) {
- if (mDb == null) {
- SqlHelper mHelper = new SqlHelper(mContext);
- mDb = mHelper.getWritableDatabase();
- mUtil = DbUtil.getInstance(mDb);
- }
- }
- }
- if (newTable && !mUtil.tableExists(this)) {
- mUtil.createTable(this);
- }
- }
-
/**
* 获取所有行的rowid
*/
public int[] getRowId() {
- Cursor cursor = mUtil.getRowId(this);
- int[] ids = new int[cursor.getCount()];
- int i = 0;
- while (cursor.moveToNext()) {
- ids[i] = cursor.getInt(cursor.getColumnIndex("rowid"));
- i++;
- }
- return ids;
+ return mUtil.getRowId(this);
}
/**
@@ -96,10 +53,47 @@ public class DbEntity {
mUtil.modifyData(this);
}
+
/**
- * 插入数据
+ * 保存自身,如果表中已经有数据,则更新数据,否则插入数据
*/
public void save() {
+ if (thisIsExist()) {
+ update();
+ } else {
+ insert();
+ }
+ }
+
+ /**
+ * 查找数据在表中是否存在
+ */
+ private boolean thisIsExist() {
+ try {
+ Field[] fields = getClass().getFields();
+ List where = new ArrayList<>();
+ List values = new ArrayList<>();
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
+ }
+ where.add(field.getName());
+ values.add((String) field.get(getClass()));
+ }
+ return findData(getClass(), (String[]) where.toArray(),
+ (String[]) values.toArray()) != null;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ /**
+ * 插入数据
+ */
+ public void insert() {
mUtil.insertData(this);
}
@@ -109,10 +103,7 @@ public class DbEntity {
* @return 没有数据返回null
*/
public List findAllData(Class clazz) {
- Cursor cursor = mUtil.findAllData(this);
- return cursor.getCount() > 0 ?
- newInstanceEntity(clazz, cursor) :
- null;
+ return mUtil.findAllData(clazz, this);
}
/**
@@ -120,12 +111,9 @@ public class DbEntity {
*
* @return 没有数据返回null
*/
- public List findDatas(Class clazz, @NonNull Object[] wheres,
- @NonNull Object[] values) {
- Cursor cursor = mUtil.findData(this, wheres, values);
- return cursor.getCount() > 0 ?
- newInstanceEntity(clazz, cursor) :
- null;
+ public List findDatas(Class clazz, @NonNull String[] wheres,
+ @NonNull String[] values) {
+ return mUtil.findData(clazz, this, wheres, values);
}
/**
@@ -133,71 +121,9 @@ public class DbEntity {
*
* @return 没有数据返回null
*/
- public T findData(Class clazz, @NonNull Object[] wheres,
- @NonNull Object[] values) {
- Cursor cursor = mUtil.findData(this, wheres, values);
- return cursor.getCount() > 0 ?
- newInstanceEntity(clazz, cursor).get(0) :
- null;
- }
-
- /**
- * 根据数据游标创建一个具体的对象
- */
- private List newInstanceEntity(Class clazz, Cursor cursor) {
- Field[] fields = Util.getFields(clazz);
- List entitys = new ArrayList<>();
- if (fields != null && fields.length > 0) {
- try {
- while (cursor.moveToNext()) {
- Class[] paramTypes = {Context.class,
- boolean.class};
- Object[] params = {mContext,
- false};
- Constructor con = clazz.getConstructor(paramTypes);
- T entity = con.newInstance(params);
- for (Field field : fields) {
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- continue;
- }
- Class> type = field.getType();
- int column = cursor.getColumnIndex(field.getName());
- if (type == String.class) {
- field.set(entity, cursor.getString(column));
- } else if (type == int.class || type == Integer.class) {
- field.setInt(entity, cursor.getInt(column));
- } else if (type == float.class || type == Float.class) {
- field.setFloat(entity, cursor.getFloat(column));
- } else if (type == double.class || type == Double.class) {
- field.setDouble(entity, cursor.getDouble(column));
- } else if (type == long.class || type == Long.class) {
- field.setLong(entity, cursor.getLong(column));
- } else if (type == boolean.class || type == Boolean.class) {
- field.setBoolean(entity,
- !cursor.getString(column).equalsIgnoreCase("false"));
- } else if (type == java.util.Date.class || type == java.sql.Date.class) {
- field.set(entity, new Date(cursor.getString(column)));
- } else if (type == byte[].class) {
- field.set(entity, cursor.getBlob(column));
- }
- // field.set(entity, cursor.getColumnIndex("entity_id"));
- }
- entity.rowID = cursor.getInt(cursor.getColumnIndex("rowid"));
- entitys.add(entity);
- }
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- cursor.close();
- return entitys;
+ public T findData(Class clazz, @NonNull String[] wheres,
+ @NonNull String[] values) {
+ List datas = mUtil.findData(clazz, this, wheres, values);
+ return datas.size() > 0 ? datas.get(0) : null;
}
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
index 571de982..800210ed 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
@@ -1,5 +1,7 @@
package com.arialyy.downloadutil.orm;
+import android.app.Application;
+import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
@@ -8,6 +10,9 @@ import android.util.Log;
import com.arialyy.downloadutil.util.Util;
import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
/**
* Created by AriaLyy on 2015/2/11.
@@ -15,7 +20,8 @@ import java.lang.reflect.Field;
*/
public class DbUtil {
private static final String TAG = "DbUtil";
- private volatile static DbUtil mDbUtil = null;
+ private volatile static DbUtil INSTANCE = null;
+ private static final Object LOCK = new Object();
private int CREATE_TABLE = 0;
private int TABLE_EXISTS = 1;
private int INSERT_DATA = 2;
@@ -24,32 +30,40 @@ public class DbUtil {
private int FIND_ALL_DATA = 5;
private int DEL_DATA = 6;
private int ROW_ID = 7;
- private static final Object LOCK = new Object();
private SQLiteDatabase mDb;
+ private SqlHelper mHelper;
private DbUtil() {
}
- private DbUtil(SQLiteDatabase db) {
- mDb = db;
- }
-
- protected static DbUtil getInstance(SQLiteDatabase db) {
- if (mDbUtil == null) {
+ public static DbUtil init(Context context) {
+ if (context instanceof Application) {
synchronized (LOCK) {
- if (mDbUtil == null) {
- mDbUtil = new DbUtil(db);
+ if (INSTANCE == null) {
+ INSTANCE = new DbUtil(context);
}
}
}
- return mDbUtil;
+ return INSTANCE;
+ }
+
+ private DbUtil(Context context) {
+ mHelper = new SqlHelper(context.getApplicationContext());
+ }
+
+ protected static DbUtil getInstance() {
+ if (INSTANCE == null) {
+ throw new NullPointerException("请在Application中调用init进行数据库工具注册注册");
+ }
+ return INSTANCE;
}
/**
* 删除某条数据
*/
protected void delData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
+ mDb = mHelper.getWritableDatabase();
if (wheres.length <= 0 || values.length <= 0) {
Log.e(TAG, "输入删除条件");
return;
@@ -62,19 +76,19 @@ public class DbUtil {
int i = 0;
for (Object where : wheres) {
sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ?
- "" :
- ",");
+ sb.append(i >= wheres.length - 1 ? "" : ",");
i++;
}
print(DEL_DATA, sb.toString());
mDb.execSQL(sb.toString());
+ close();
}
/**
* 修改某行数据
*/
protected void modifyData(DbEntity dbEntity) {
+ mDb = mHelper.getWritableDatabase();
Class> clazz = dbEntity.getClass();
Field[] fields = Util.getFields(clazz);
if (fields != null && fields.length > 0) {
@@ -87,14 +101,12 @@ public class DbUtil {
if (ignore != null && ignore.value()) {
continue;
}
- sb.append(i > 0 ?
- ", " :
- "");
+ sb.append(i > 0 ? ", " : "");
try {
sb.append(field.getName())
- .append(" = '")
- .append(field.get(dbEntity).toString())
- .append("'");
+ .append(" = '")
+ .append(field.get(dbEntity).toString())
+ .append("'");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
@@ -103,23 +115,28 @@ public class DbUtil {
print(MODIFY_DATA, sb.toString());
mDb.execSQL(sb.toString());
}
+ close();
}
/**
* 遍历所有数据
*/
- protected Cursor findAllData(DbEntity dbEntity) {
+ protected List findAllData(Class clazz, DbEntity dbEntity) {
+ mDb = mHelper.getReadableDatabase();
StringBuilder sb = new StringBuilder();
sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
print(FIND_ALL_DATA, sb.toString());
- return mDb.rawQuery(sb.toString(), null);
+ Cursor cursor = mDb.rawQuery(sb.toString(), null);
+ return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
}
/**
* 条件查寻数据
*/
- protected Cursor findData(DbEntity dbEntity, @NonNull Object[] wheres,
- @NonNull Object[] values) {
+ protected List findData(Class clazz, DbEntity dbEntity,
+ @NonNull String[] wheres,
+ @NonNull String[] values) {
+ mDb = mHelper.getReadableDatabase();
if (wheres.length <= 0 || values.length <= 0) {
Log.e(TAG, "请输入查询条件");
return null;
@@ -132,19 +149,22 @@ public class DbUtil {
int i = 0;
for (Object where : wheres) {
sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ?
- "" :
- ", ");
+ sb.append(i >= wheres.length - 1 ? "" : ", ");
i++;
}
print(FIND_DATA, sb.toString());
- return mDb.rawQuery(sb.toString(), null);
+ Cursor cursor = mDb.rawQuery(sb.toString(), null);
+ return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
}
/**
* 插入数据
*/
protected void insertData(DbEntity dbEntity) {
+ mDb = mHelper.getWritableDatabase();
+ if (!tableExists(dbEntity)) {
+ createTable(dbEntity);
+ }
Class> clazz = dbEntity.getClass();
Field[] fields = Util.getFields(clazz);
if (fields != null && fields.length > 0) {
@@ -157,9 +177,7 @@ public class DbUtil {
if (ignore != null && ignore.value()) {
continue;
}
- sb.append(i > 0 ?
- ", " :
- "");
+ sb.append(i > 0 ? ", " : "");
sb.append(field.getName());
i++;
}
@@ -171,9 +189,7 @@ public class DbUtil {
if (ignore != null && ignore.value()) {
continue;
}
- sb.append(i > 0 ?
- ", " :
- "");
+ sb.append(i > 0 ? ", " : "");
sb.append("'");
try {
sb.append(field.get(dbEntity)).append("'");
@@ -186,12 +202,13 @@ public class DbUtil {
print(INSERT_DATA, sb.toString());
mDb.execSQL(sb.toString());
}
+ close();
}
/**
* 查找某张表是否存在
*/
- protected boolean tableExists(DbEntity dbEntity) {
+ public boolean tableExists(DbEntity dbEntity) {
Cursor cursor = null;
try {
StringBuilder sb = new StringBuilder();
@@ -217,19 +234,15 @@ public class DbUtil {
/**
* 创建表
*/
- protected void createTable(DbEntity dbEntity) {
+ private void createTable(DbEntity dbEntity) {
Field[] fields = Util.getFields(dbEntity.getClass());
if (fields != null && fields.length > 0) {
StringBuilder sb = new StringBuilder();
sb.append("create table ").append(Util.getClassName(dbEntity)).append("(");
- int i = 0;
- int ignoreNum = 0;
for (Field field : fields) {
- i++;
field.setAccessible(true);
Ignore ignore = field.getAnnotation(Ignore.class);
if (ignore != null && ignore.value()) {
- ignoreNum++;
continue;
}
sb.append(field.getName());
@@ -251,13 +264,12 @@ public class DbUtil {
} else {
sb.append(" blob");
}
- sb.append(i >= fields.length - ignoreNum - 1 ?
- "" :
- ", ");
+ sb.append(",");
}
- sb.append(");");
- print(CREATE_TABLE, sb.toString());
- mDb.execSQL(sb.toString());
+ String str = sb.toString();
+ str = str.substring(0, str.length() - 1) + ");";
+ print(CREATE_TABLE, str);
+ mDb.execSQL(str);
}
}
@@ -294,25 +306,34 @@ public class DbUtil {
/**
* 关闭数据库
*/
- protected void close() {
+ private void close() {
if (mDb != null) {
mDb.close();
}
}
/**
- * 获取所有行Id
+ * 获取所在行Id
*/
- protected Cursor getRowId(DbEntity dbEntity) {
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
- return mDb.rawQuery(sb.toString(), null);
+ protected int[] getRowId(DbEntity dbEntity) {
+ mDb = mHelper.getReadableDatabase();
+ Cursor cursor = mDb.rawQuery("SELECT rowid, * FROM " + Util.getClassName(dbEntity), null);
+ int[] ids = new int[cursor.getCount()];
+ int i = 0;
+ while (cursor.moveToNext()) {
+ ids[i] = cursor.getInt(cursor.getColumnIndex("rowid"));
+ i++;
+ }
+ cursor.close();
+ close();
+ return ids;
}
/**
* 获取行Id
*/
protected int getRowId(DbEntity dbEntity, Object[] wheres, Object[] values) {
+ mDb = mHelper.getReadableDatabase();
if (wheres.length <= 0 || values.length <= 0) {
Log.e(TAG, "请输入删除条件");
return -1;
@@ -325,15 +346,66 @@ public class DbUtil {
int i = 0;
for (Object where : wheres) {
sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ?
- "" :
- ",");
+ sb.append(i >= wheres.length - 1 ? "" : ",");
i++;
}
print(ROW_ID, sb.toString());
Cursor c = mDb.rawQuery(sb.toString(), null);
int id = c.getColumnIndex("rowid");
c.close();
+ close();
return id;
}
+
+ /**
+ * 根据数据游标创建一个具体的对象
+ */
+ private List newInstanceEntity(Class clazz, Cursor cursor) {
+ Field[] fields = Util.getFields(clazz);
+ List entitys = new ArrayList<>();
+ if (fields != null && fields.length > 0) {
+ try {
+ while (cursor.moveToNext()) {
+ T entity = clazz.newInstance();
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
+ }
+ Class> type = field.getType();
+ int column = cursor.getColumnIndex(field.getName());
+ if (type == String.class) {
+ field.set(entity, cursor.getString(column));
+ } else if (type == int.class || type == Integer.class) {
+ field.setInt(entity, cursor.getInt(column));
+ } else if (type == float.class || type == Float.class) {
+ field.setFloat(entity, cursor.getFloat(column));
+ } else if (type == double.class || type == Double.class) {
+ field.setDouble(entity, cursor.getDouble(column));
+ } else if (type == long.class || type == Long.class) {
+ field.setLong(entity, cursor.getLong(column));
+ } else if (type == boolean.class || type == Boolean.class) {
+ field.setBoolean(entity,
+ !cursor.getString(column).equalsIgnoreCase("false"));
+ } else if (type == java.util.Date.class || type == java.sql.Date.class) {
+ field.set(entity, new Date(cursor.getString(column)));
+ } else if (type == byte[].class) {
+ field.set(entity, cursor.getBlob(column));
+ }
+ // field.set(entity, cursor.getColumnIndex("entity_id"));
+ }
+ entity.rowID = cursor.getInt(cursor.getColumnIndex("rowid"));
+ entitys.add(entity);
+ }
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ cursor.close();
+ close();
+ return entitys;
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
index 9f16d3d9..9888c950 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
@@ -10,5 +10,5 @@ import java.lang.annotation.Target;
* 忽略某个字段
*/
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Ignore {
- boolean value() default false;
+ boolean value() default true;
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/util/SQLHelper.java b/downloadutil/src/main/java/com/arialyy/downloadutil/util/SQLHelper.java
index f2bfd398..e33397b2 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/SQLHelper.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/SQLHelper.java
@@ -55,7 +55,7 @@
// Cursor c = db.query(TABLE_NAME, null, null, null, null, null, null);
// if (c.moveToFirst()) {
// while (c.moveToNext()) {
-// list.add(cursor2Entity(c));
+// list.insert(cursor2Entity(c));
// }
// }
// c.close();