package com.salama.android.dataservice; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import MetoXML.Util.PropertyDescriptor; import com.salama.android.datacore.DBDataUtil; import com.salama.android.datacore.DataTableSetting; import com.salama.android.datacore.PropertyInfoUtil; import com.salama.android.datacore.SqliteUtil; import com.salama.android.datacore.SqliteUtilException; public class LocalStorageService { /** * 保存数据 * @param dataTableName 数据表名 * @param datas 数据列表 * @param extraIndexNames 外部索引字段名(逗号分隔) * @param extraIndexValues 外部索引值(逗号分隔) * @param dbDataUtil DBDataUtil实例 * @throws SqliteUtilException * @throws IllegalAccessException * @throws InvocationTargetException */ public void storeDataToTable(String tableName, List<?> datas, List<String> extraIndexNames, List<String> extraIndexValues, DBDataUtil dbDataUtil) throws SqliteUtilException, IllegalAccessException, InvocationTargetException { if(datas == null || datas.size() == 0 || tableName == null || tableName.length() == 0) { return; } Object dataTmp = null; boolean hasExtraIndex = false; if(extraIndexNames != null && extraIndexNames.size() > 0) { hasExtraIndex = true; } List<Object> insertedDatas = new ArrayList<Object>(); for(int i = 0; i < datas.size(); i++) { dataTmp = datas.get(i); //store data try { //insert dbDataUtil.insertData(tableName, dataTmp); insertedDatas.add(dataTmp); } catch(Exception e) { //update dbDataUtil.updateDataByPK(tableName, dataTmp); } } //add the extra index row if(hasExtraIndex) { ExtraIndexManager.insertExtraIndexWithDataTableName(tableName, insertedDatas, extraIndexNames, extraIndexValues, dbDataUtil); } } /** * 删除数据 * @param dataTableName 数据表名 * @param datas 数据列表 * @param dbDataUtil DBDataUtil实例 * @throws SqliteUtilException * @throws InvocationTargetException * @throws IllegalAccessException */ public void removeDataAndExtraIndexForTable(String tableName, List<?> datas, DBDataUtil dbDataUtil) throws SqliteUtilException, InvocationTargetException, IllegalAccessException { if(datas == null || datas.size() == 0 || tableName == null || tableName.length() == 0) { return; } int i; // where conditions of data primary keys ------------------------------------------------------------------ //data pk column SqliteUtil.SqliteColType sqliteType; PropertyDescriptor propertyInfo; int k; DataTableSetting dataTableSetting = dbDataUtil.getDataTableSetting(tableName); String[] dataPkArray = dataTableSetting.getPrimaryKeys().split(","); List<PropertyDescriptor> propertyInfoArrayOfDataClass = PropertyInfoUtil.getPropertyInfoList(datas.get(0).getClass()); List<PropertyDescriptor> propertyInfoArrayOfPKs = new ArrayList<PropertyDescriptor>(); for(i = 0; i < dataPkArray.length; i++) { for(k = 0; k < propertyInfoArrayOfDataClass.size(); k++) { propertyInfo = propertyInfoArrayOfDataClass.get(k); if(propertyInfo.getName().equalsIgnoreCase(dataPkArray[i])) { //pk propertyInfoArrayOfPKs.add(propertyInfo); break; } } } //sql of conditions StringBuilder sqlOfWhereConditionPart = new StringBuilder(); String pkNameTmp = null; Object oneDataTmp = null; Object propertyValue; for(k = 0; k < datas.size(); k++) { oneDataTmp = datas.get(k); if(k == 0) { sqlOfWhereConditionPart.append(" ("); } else { sqlOfWhereConditionPart.append(" or ("); } //handle one data row ---------------------- for(i = 0; i < propertyInfoArrayOfPKs.size(); i++) { propertyInfo = propertyInfoArrayOfPKs.get(i); pkNameTmp = propertyInfo.getName(); propertyValue = propertyInfo.getReadMethod().invoke(oneDataTmp); sqliteType = SqliteUtil.getSQLiteColumnTypeByPropertyType(propertyInfo.getPropertyType()); if(sqliteType == SqliteUtil.SqliteColType.SQLITE_TEXT) { sqlOfWhereConditionPart.append(" and " + pkNameTmp + " = '" + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)) + "' "); } else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_INTEGER) { sqlOfWhereConditionPart.append(" and " + pkNameTmp + " = " + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue))); } else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_FLOAT) { sqlOfWhereConditionPart.append(" and " + pkNameTmp + " = " + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue))); } } sqlOfWhereConditionPart.append(" ) "); } //delete data rows ----------------------------------------------- { StringBuilder sqlOfDeleteData = new StringBuilder("delete from " + tableName); sqlOfDeleteData.append(" where "); sqlOfDeleteData.append(sqlOfWhereConditionPart.toString()); dbDataUtil.getSqliteUtil().executeUpdate(sqlOfDeleteData.toString()); } //delete extra index rows ---------------------------------------- { String indexTableName = ExtraIndexManager.getExtraIndexTableNameByDataTableName(tableName); StringBuilder sqlOfDeleteExtraIndex = new StringBuilder("delete from " + indexTableName); sqlOfDeleteExtraIndex.append(" where "); sqlOfDeleteExtraIndex.append(sqlOfWhereConditionPart.toString()); dbDataUtil.getSqliteUtil().executeUpdate(sqlOfDeleteExtraIndex.toString()); } } }