“例子编写”

pull/2/head
lyy 8 years ago
parent 2ad2f31594
commit 5de6372579
  1. 4
      .idea/codeStyleSettings.xml
  2. 1
      app/src/main/AndroidManifest.xml
  3. 58
      app/src/main/java/com/arialyy/simple/activity/SimpleTestActivity.java
  4. 2
      app/src/main/java/com/arialyy/simple/base/BaseApplication.java
  5. 2
      app/src/main/java/com/arialyy/simple/module/DownloadModule.java
  6. 28
      downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
  7. 23
      downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
  8. 19
      downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
  9. 5
      downloadutil/src/main/java/com/arialyy/downloadutil/core/command/CommandFactory.java
  10. 2
      downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
  11. 14
      downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
  12. 172
      downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
  13. 182
      downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
  14. 2
      downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
  15. 2
      downloadutil/src/main/java/com/arialyy/downloadutil/util/SQLHelper.java

@ -63,9 +63,7 @@
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />

@ -5,7 +5,6 @@
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:name=".base.BaseApplication"
android:allowBackup="true"

@ -1,5 +1,6 @@
package com.arialyy.simple.activity;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@ -20,6 +21,9 @@ import com.arialyy.downloadutil.core.command.IDownloadCommand;
import com.arialyy.downloadutil.entity.DownloadEntity;
import com.arialyy.downloadutil.util.DownLoadUtil;
import com.arialyy.downloadutil.util.Util;
import com.arialyy.frame.permission.OnPermissionCallback;
import com.arialyy.frame.permission.PermissionManager;
import com.arialyy.frame.util.show.L;
import com.arialyy.simple.R;
import com.arialyy.simple.base.BaseActivity;
import com.arialyy.simple.databinding.ActivitySimpleBinding;
@ -83,8 +87,34 @@ public class SimpleTestActivity extends BaseActivity<ActivitySimpleBinding> {
};
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<ActivitySimpleBinding> {
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<ActivitySimpleBinding> {
}
}
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<ActivitySimpleBinding> {
.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() {

@ -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);
}
}

@ -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);

@ -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;
}
/**

@ -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() + "】的任务");
}

@ -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);

@ -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:

@ -24,7 +24,7 @@ public abstract class IDownloadCommand {
if (!CheckHelp.checkDownloadEntity(entity)) {
return;
}
target = DownloadTarget.getInstance(context);
target = DownloadTarget.getInstance();
mContext = context;
mEntity = entity;
}

@ -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<DownloadEntity> CREATOR = new Creator<DownloadEntity>() {
@Override public DownloadEntity createFromParcel(Parcel source) {
return new DownloadEntity(source);

@ -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<String> where = new ArrayList<>();
List<String> 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 <T extends DbEntity> List<T> findAllData(Class<T> 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 <T extends DbEntity> List<T> findDatas(Class<T> clazz, @NonNull Object[] wheres,
@NonNull Object[] values) {
Cursor cursor = mUtil.findData(this, wheres, values);
return cursor.getCount() > 0 ?
newInstanceEntity(clazz, cursor) :
null;
public <T extends DbEntity> List<T> findDatas(Class<T> 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 extends DbEntity> T findData(Class<T> 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 <T extends DbEntity> List<T> newInstanceEntity(Class<T> clazz, Cursor cursor) {
Field[] fields = Util.getFields(clazz);
List<T> entitys = new ArrayList<>();
if (fields != null && fields.length > 0) {
try {
while (cursor.moveToNext()) {
Class[] paramTypes = {Context.class,
boolean.class};
Object[] params = {mContext,
false};
Constructor<T> 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 extends DbEntity> T findData(Class<T> clazz, @NonNull String[] wheres,
@NonNull String[] values) {
List<T> datas = mUtil.findData(clazz, this, wheres, values);
return datas.size() > 0 ? datas.get(0) : null;
}
}

@ -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 <T extends DbEntity> List<T> findAllData(Class<T> 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 <T extends DbEntity> List<T> findData(Class<T> 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 <T extends DbEntity> List<T> newInstanceEntity(Class<T> clazz, Cursor cursor) {
Field[] fields = Util.getFields(clazz);
List<T> 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;
}
}

@ -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;
}

@ -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();

Loading…
Cancel
Save