/*
* Copyright (C) 2012 www.amsoft.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ab.db.storage;
import java.util.List;
import android.content.Context;
import com.ab.db.orm.dao.AbDBDaoImpl;
import com.ab.db.storage.AbSqliteStorageListener.AbDataDeleteListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataInsertListListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataInsertListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataSelectListener;
import com.ab.db.storage.AbSqliteStorageListener.AbDataUpdateListener;
import com.ab.task.AbTaskItem;
import com.ab.task.AbTaskListListener;
import com.ab.task.AbTaskObjectListener;
import com.ab.task.thread.AbTaskQueue;
// TODO: Auto-generated Javadoc
/**
* © 2012 amsoft.cn
* 名称:AbSqliteStorage.java
* 描述:数据库对象操作类
*
* @author 还如一梦中
* @version v1.0
* @date:2013-10-16 下午1:33:39
*/
public class AbSqliteStorage {
/** 单例. */
private static AbSqliteStorage mSqliteStorage = null;
/** 队列. */
private static AbTaskQueue mAbTask = null;
/**
* 描述:获取存储实例.
*
* @param context the context
* @return single instance of AbSqliteStorage
*/
public static AbSqliteStorage getInstance(Context context){
if (null == mSqliteStorage){
mSqliteStorage = new AbSqliteStorage(context);
}
if(mAbTask == null){
//用队列避免并发访问数据库问题
mAbTask = AbTaskQueue.newInstance();
}
return mSqliteStorage;
}
/**
* 初始化.
*
* @param context the context
*/
private AbSqliteStorage(Context context) {
super();
}
/**
* 描述:插入数据.
*
* @param <T> the generic type
* @param entity 实体类 设置了对象关系映射
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void insertData(final T entity,final AbDBDaoImpl<T> dao, final AbDataInsertListener paramDataInsertListener){
if (entity != null){
AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskObjectListener() {
@SuppressWarnings({ "hiding", "unchecked" })
@Override
public <T> T getObject() {
long rowId = -1;
try {
//(1)获取数据库
dao.startWritableDatabase(false);
//(2)执行
rowId = dao.insert(entity);
} catch (Exception e) {
e.printStackTrace();
if (paramDataInsertListener != null){
paramDataInsertListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return (T)Long.valueOf(rowId);
}
@SuppressWarnings("hiding")
@Override
public <T> void update(T obj) {
long rowId = (Long)obj;
if (paramDataInsertListener != null){
if(rowId > -1){
paramDataInsertListener.onSuccess(rowId);
}else{
paramDataInsertListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, "");
}
}
}
});
mAbTask.execute(item);
}else{
if (paramDataInsertListener != null){
paramDataInsertListener.onFailure(AbDBStatus.BAD_PARAMS_CODE, "");
}
}
}
/**
* 描述:插入数据.
*
* @param <T> the generic type
* @param entityList 实体类 设置了对象关系映射
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void insertData(final List<T> entityList,final AbDBDaoImpl<T> dao, final AbDataInsertListListener paramDataInsertListListener){
if (entityList != null){
AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskObjectListener() {
@SuppressWarnings({ "hiding", "unchecked" })
@Override
public <T> T getObject() {
long[] rowIds = null;
try {
//(1)获取数据库
dao.startWritableDatabase(false);
//(2)执行
rowIds = dao.insertList(entityList);
} catch (Exception e) {
e.printStackTrace();
if (paramDataInsertListListener != null){
paramDataInsertListListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return (T)rowIds;
}
@SuppressWarnings("hiding")
@Override
public <T> void update(T obj) {
long sum = -1;
long[] rowIdsBase = null;
if(obj!=null){
Long[] rowIds = (Long[])obj;
rowIdsBase = new long[rowIds.length];
for(int i=0;i<rowIds.length;i++){
long rowId = rowIds[i];
sum += rowId;
rowIdsBase[i] = rowId;
}
}
if (paramDataInsertListListener != null){
if(sum > -1){
paramDataInsertListListener.onSuccess(rowIdsBase);
}else{
paramDataInsertListListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, "");
}
}
}
});
mAbTask.execute(item);
}else{
if (paramDataInsertListListener != null){
paramDataInsertListListener.onFailure(AbDBStatus.BAD_PARAMS_CODE, "");
}
}
}
/**
* 查找数据.
*
* @param <T> 描述:查询数据
* @param storageQuery the storage query
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void findData(final AbStorageQuery storageQuery,final AbDBDaoImpl<T> dao, final AbDataSelectListener paramDataSelectListener){
final AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskListListener() {
@Override
public List<?> getList() {
List<?> list = null;
try {
//(1)获取数据库
dao.startReadableDatabase();
//(2)执行
if(storageQuery.getLimit()!=-1 && storageQuery.getOffset()!=-1){
list = dao.queryList(null, storageQuery.getWhereClause(),storageQuery.getWhereArgs(), storageQuery.getGroupBy(), storageQuery.getHaving(), storageQuery.getOrderBy()+" limit "+storageQuery.getLimit()+ " offset " +storageQuery.getOffset(), null);
}else{
list = dao.queryList(null, storageQuery.getWhereClause(),storageQuery.getWhereArgs(), storageQuery.getGroupBy(), storageQuery.getHaving(), storageQuery.getOrderBy(), null);
}
} catch (Exception e) {
e.printStackTrace();
if (paramDataSelectListener != null){
paramDataSelectListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return list;
}
@Override
public void update(List<?> paramList) {
if (paramDataSelectListener != null){
paramDataSelectListener.onSuccess(paramList);
}
}
});
mAbTask.execute(item);
}
/**
* 描述:修改数据.
*
* @param <T> the generic type
* @param entity 实体类 设置了对象关系映射
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void updateData(final T entity,final AbDBDaoImpl<T> dao, final AbDataUpdateListener paramDataUpdateListener){
if (entity != null){
AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskObjectListener() {
@SuppressWarnings({ "hiding", "unchecked" })
@Override
public <T> T getObject() {
int rows = 0;
try {
//(1)获取数据库
dao.startWritableDatabase(false);
//(2)执行
rows = dao.update(entity);
} catch (Exception e) {
e.printStackTrace();
if (paramDataUpdateListener != null){
paramDataUpdateListener.onFailure(AbDBStatus.EXEC_ERROR_CODE,e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return (T)Integer.valueOf(rows);
}
@SuppressWarnings("hiding")
@Override
public <T> void update(T obj) {
int rows = (Integer)obj;
if (paramDataUpdateListener != null){
paramDataUpdateListener.onSuccess(rows);
}
}
});
mAbTask.execute(item);
}else{
if (paramDataUpdateListener != null){
paramDataUpdateListener.onFailure(AbDBStatus.BAD_PARAMS_CODE, "");
}
}
}
/**
* 描述:修改数据.
*
* @param <T> the generic type
* @param entityList 实体类 设置了对象关系映射
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void updateData(final List<T> entityList,final AbDBDaoImpl<T> dao, final AbDataUpdateListener paramDataUpdateListener){
if (entityList != null){
AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskObjectListener() {
@SuppressWarnings({ "unchecked", "hiding" })
@Override
public <T> T getObject() {
int rows = 0;
try {
//(1)获取数据库
dao.startWritableDatabase(false);
//(2)执行
rows = dao.updateList(entityList);
} catch (Exception e) {
e.printStackTrace();
if (paramDataUpdateListener != null){
paramDataUpdateListener.onFailure(AbDBStatus.EXEC_ERROR_CODE,e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return (T)Integer.valueOf(rows);
}
@SuppressWarnings("hiding")
@Override
public <T> void update(T obj) {
try {
int ret = (Integer)obj;
if (paramDataUpdateListener != null){
if(ret >= 0){
paramDataUpdateListener.onSuccess(ret);
}else{
paramDataUpdateListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, "");
}
}
} catch (Exception e) {
e.printStackTrace();
if (paramDataUpdateListener != null){
paramDataUpdateListener.onFailure(AbDBStatus.EXEC_ERROR_CODE,e.getMessage());
}
}
}
});
mAbTask.execute(item);
}else{
if (paramDataUpdateListener != null){
paramDataUpdateListener.onFailure(AbDBStatus.BAD_PARAMS_CODE, "");
}
}
}
/**
* 描述:修改数据.
*
* @param <T> the generic type
* @param storageQuery 条件实体
* @param dao 实现AbDBDaoImpl的Dao
* @param paramDataInsertListener 返回监听器
*/
public <T> void deleteData(final AbStorageQuery storageQuery,final AbDBDaoImpl<T> dao, final AbDataDeleteListener paramDataDeleteListener){
AbTaskItem item = new AbTaskItem();
item.setListener(new AbTaskObjectListener() {
@SuppressWarnings({ "unchecked", "hiding" })
@Override
public <T> T getObject() {
int rows = 0;
try {
//(1)获取数据库
dao.startWritableDatabase(false);
//(2)执行
rows = dao.delete(storageQuery.getWhereClause(),storageQuery.getWhereArgs());
} catch (Exception e) {
e.printStackTrace();
if (paramDataDeleteListener != null){
paramDataDeleteListener.onFailure(AbDBStatus.EXEC_ERROR_CODE,e.getMessage());
}
}finally{
//(3)关闭数据库
dao.closeDatabase();
}
return (T)Integer.valueOf(rows);
}
@SuppressWarnings("hiding")
@Override
public <T> void update(T obj) {
int rows = (Integer)obj;
if (paramDataDeleteListener != null){
if(rows >= 0){
paramDataDeleteListener.onSuccess(rows);
}else{
paramDataDeleteListener.onFailure(AbDBStatus.EXEC_ERROR_CODE, "");
}
}
}
});
mAbTask.execute(item);
}
/**
* 描述:释放存储实例.
*/
public void release(){
if(mAbTask!=null){
mAbTask.cancel(true);
mAbTask = null;
}
}
}