数据库为空值的处理 以及List.add方法

本文详细解释了在声明List元素时使用List<class> name=new ArrayList<class>()的重要性,并阐述了其背后的原理。通过理解ArrayList的长度可变特性,读者将学会如何正确地使用add等方法进行元素添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List.add  在声明List元素的时候应当用List<class>  name = new  ArrayList<class>()

只用这样才能正常的使用add等方法。


这主要是因为ArrayList的长度是可变的,因此可以不断地添加。

package com.example.kucun2.entity.data; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.util.Log; import com.example.kucun2.entity.*; import com.example.kucun2.function.MyAppFnction; import com.example.kucun2.function.SafeLogger; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; import java.util.stream.Collectors; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class Data { // 数据集合声明(保持原有属性名不变) public static SynchronizedList<Bancai> bancais = new SynchronizedList<>(Bancai.class); public static SynchronizedList<Caizhi> caizhis = new SynchronizedList<>(Caizhi.class); public static SynchronizedList<Mupi> mupis = new SynchronizedList<>(Mupi.class); public static SynchronizedList<Chanpin> chanpins = new SynchronizedList<>(Chanpin.class); public static SynchronizedList<Chanpin_Zujian> chanpin_zujians = new SynchronizedList<>(Chanpin_Zujian.class); public static SynchronizedList<Dingdan> dingdans = new SynchronizedList<>(Dingdan.class); public static SynchronizedList<Dingdan_Chanpin> dingdan_chanpins = new SynchronizedList<>(Dingdan_Chanpin.class); public static SynchronizedList<Dingdan_chanpin_zujian> Dingdan_chanpin_zujians = new SynchronizedList<>(Dingdan_chanpin_zujian.class); public static SynchronizedList<Kucun> kucuns = new SynchronizedList<>(Kucun.class); public static SynchronizedList<Zujian> zujians = new SynchronizedList<>(Zujian.class); public static SynchronizedList<User> users = new SynchronizedList<>(User.class); public static SynchronizedList<Jinhuo> jinhuos = new SynchronizedList<>(Jinhuo.class); public static final Map<Class, SynchronizedList<SynchronizableEntity>> dataCollectionMap = new HashMap<>(); private static final Gson gson = GsonFactory.createWithIdSerialization(); private static OkHttpClient client; private static final String TAG = "DataLoader"; static { // 静态初始化块:在类加载时执行,保证所有静态字段已初始化 try { Field[] fields = Data.class.getDeclaredFields(); for (Field field : fields) { if (SynchronizedList.class.equals(field.getType())) { SynchronizedList<?> list = (SynchronizedList<?>) field.get(null); if (list != null) { dataCollectionMap.put(list.getEntityType(), (SynchronizedList<SynchronizableEntity>) list); } } } } catch (IllegalAccessException e) { throw new RuntimeException("初始化dataCollectionMap失败", e); } } public static void loadAllData(Context context, LoadDataCallback callback) { ensurePreservedObjects(); if (Looper.myLooper() != Looper.getMainLooper()) { throw new IllegalStateException("Data.loadAllData must be called on main thread"); } if (client == null) { client = MyAppFnction.getClient(); } SynchronizableEntity.setSyncEnabled(false); String url = MyAppFnction.getStringResource("string", "url") + MyAppFnction.getStringResource("string", "url_all"); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "Failed to load data", e); SynchronizableEntity.setSyncEnabled(true); safeCallback(callback, false); } @Override public void onResponse(Call call, Response response) throws IOException { if (!response.isSuccessful()) { Log.e(TAG, "Unexpected response code: " + response.code()); safeCallback(callback, false); return; } String responseData = response.body().string(); SynchronizableEntity.setSyncEnabled(true); ensurePreservedObjects(); parseAndAssignData(responseData, context, callback); } }); } // 解析并赋值数据(全面处理) private static void parseAndAssignData(String jsonData, Context context, LoadDataCallback callback) { Type informationType = new TypeToken<Information<AllDataResponse>>() {}.getType(); Information<AllDataResponse> information = null; try { information = gson.fromJson(jsonData, informationType); } catch (Exception e) { Log.e(TAG, "JSON解析失败: " + e.getMessage()); safeCallback(callback, false); return; } if (information == null || information.getData() == null || information.getStatus() != 200) { Log.e(TAG, "无效响应数据"); safeCallback(callback, false); return; } AllDataResponse allData = information.getData(); SafeLogger.d("data", "原始数据: " + gson.toJson(allData)); // 安全初始化所有列表(处理列表) safeInitializeList(allData.bancais); safeInitializeList(allData.caizhis); safeInitializeList(allData.mupis); safeInitializeList(allData.chanpins); safeInitializeList(allData.chanpin_zujians); safeInitializeList(allData.dingdans); safeInitializeList(allData.dingdan_chanpins); safeInitializeList(allData.Dingdan_chanpin_zujians); safeInitializeList(allData.kucuns); safeInitializeList(allData.zujians); safeInitializeList(allData.users); safeInitializeList(allData.jinhuos); // 过滤掉所有列表中的值 allData.bancais = filterNulls(allData.bancais); allData.caizhis = filterNulls(allData.caizhis); allData.mupis = filterNulls(allData.mupis); allData.chanpins = filterNulls(allData.chanpins); allData.chanpin_zujians = filterNulls(allData.chanpin_zujians); allData.dingdans = filterNulls(allData.dingdans); allData.dingdan_chanpins = filterNulls(allData.dingdan_chanpins); allData.Dingdan_chanpin_zujians = filterNulls(allData.Dingdan_chanpin_zujians); allData.kucuns = filterNulls(allData.kucuns); allData.zujians = filterNulls(allData.zujians); allData.users = filterNulls(allData.users); allData.jinhuos = filterNulls(allData.jinhuos); // 更新列表(保留预置对象) updateList(bancais, allData.bancais); updateList(caizhis, allData.caizhis); updateList(mupis, allData.mupis); updateList(chanpins, allData.chanpins); updateList(chanpin_zujians, allData.chanpin_zujians); updateList(dingdans, allData.dingdans); updateList(dingdan_chanpins, allData.dingdan_chanpins); updateList(Dingdan_chanpin_zujians, allData.Dingdan_chanpin_zujians); updateList(kucuns, allData.kucuns); updateList(zujians, allData.zujians); updateList(users, allData.users); updateList(jinhuos, allData.jinhuos); SynchronizableEntity.setSyncEnabled(false); // 自动关联实体(全面值防护) automaticAssociation(); // 设置所有实体状态 setAllEntitiesState(SynchronizableEntity.SyncState.MODIFIED); ensurePreservedObjects(); SynchronizableEntity.setSyncEnabled(true); safeCallback(callback, true); } // 安全回调方法 public static void safeCallback(LoadDataCallback callback, boolean success) { new Handler(Looper.getMainLooper()).post(() -> { if (callback != null) { if (success) { callback.onSuccess(); } else { callback.onFailure(); } } }); } // 更新列表内容但保持对象引用不变(值防护) private static <T extends SynchronizableEntity> void updateList(List<T> existingList, List<T> newList) { if (newList == null) return; // 创建临时列表保留预置对象 List<T> preservedObjects = new ArrayList<>(); for (T item : existingList) { if (item != null && item.isPreservedObject()) { preservedObjects.add(item); } } // 清除原有列表并添加保留对象 existingList.clear(); existingList.addAll(preservedObjects); // 添加新数据,跳过值和无效ID for (T newItem : newList) { if (newItem != null && newItem.getId() != null && newItem.getId() != -1) { existingList.add(newItem); } } } // 添加确保预置对象存在的方法值防护) private static void ensurePreservedObjects() { if (!containsPreservedObject(bancais)) bancais.add(createInstance(Bancai.class)); if (!containsPreservedObject(caizhis)) caizhis.add(createInstance(Caizhi.class)); if (!containsPreservedObject(mupis)) mupis.add(createInstance(Mupi.class)); if (!containsPreservedObject(chanpins)) chanpins.add(createInstance(Chanpin.class)); if (!containsPreservedObject(chanpin_zujians)) chanpin_zujians.add(createInstance(Chanpin_Zujian.class)); if (!containsPreservedObject(dingdans)) dingdans.add(createInstance(Dingdan.class)); if (!containsPreservedObject(kucuns)) kucuns.add(createInstance(Kucun.class)); if (!containsPreservedObject(zujians)) zujians.add(createInstance(Zujian.class)); if (!containsPreservedObject(Dingdan_chanpin_zujians)) Dingdan_chanpin_zujians.add(createInstance(Dingdan_chanpin_zujian.class)); if (!containsPreservedObject(dingdan_chanpins)) dingdan_chanpins.add(createInstance(Dingdan_Chanpin.class)); if (!containsPreservedObject(jinhuos)) jinhuos.add(createInstance(Jinhuo.class)); if (!containsPreservedObject(users)) users.add(createInstance(User.class)); automaticAssociation(); } // 检查列表是否包含预置对象 private static <T extends SynchronizableEntity> boolean containsPreservedObject(List<T> list) { for (T item : list) { if (item != null && item.isPreservedObject()) { return true; } } return false; } // 自动关联实体(全面值防护) private static void automaticAssociation() { try { for (Class t : dataCollectionMap.keySet()) { setDefaultAssociation(Objects.requireNonNull(dataCollectionMap.get(t))); } } catch (IllegalAccessException | ClassNotFoundException e) { Log.e(TAG, "自动关联失败", e); } } /** * 自动关联实体(加强处理) */ private static <T extends SynchronizableEntity> void setDefaultAssociation(SynchronizedList<T> list) throws IllegalAccessException, ClassNotFoundException { for (T t : list) { if (t == null) continue; // 跳过对象 Class clazz = t.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); Class fieldType = f.getType(); // 处理实体引用字段 if (SynchronizableEntity.class.isAssignableFrom(fieldType)) { SynchronizableEntity currentValue = (SynchronizableEntity) f.get(t); // 处理值或无效ID if (t.getId() < 0 || currentValue == null || currentValue.getId() == null) { // 设置为对应类型的预置对象 SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(fieldType); if (targetList != null && !targetList.isEmpty()) { f.set(t, targetList.stream() .filter(item -> item.isPreservedObject()) .findFirst() .orElse(null)); } } else { // 查找匹配的实体 SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(fieldType); if (targetList != null) { SynchronizableEntity found = targetList.stream() .filter(item -> currentValue.getId().equals(item.getId())) .findFirst() .orElse(null); // 如果找不到,使用预置对象作为回退 f.set(t, found != null ? found : targetList.stream() .filter(SynchronizableEntity::isPreservedObject) .findFirst() .orElse(null)); } } } // 处理列表字段 else if (List.class.isAssignableFrom(fieldType)) { Type genericType = f.getGenericType(); if (genericType instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) genericType; Type[] types = pt.getActualTypeArguments(); if (types.length > 0) { Class itemType = Class.forName(types[0].getTypeName()); if (SynchronizableEntity.class.isAssignableFrom(itemType)) { List<SynchronizableEntity> currentList = (List<SynchronizableEntity>) f.get(t); if (currentList == null) { currentList = new ArrayList<>(); f.set(t, currentList); } // 过滤掉值 currentList.removeAll(Collections.singleton(null)); // 处理列表或无效ID if (currentList.isEmpty() || t.getId() < 0) { SynchronizedList<SynchronizableEntity> sourceList = dataCollectionMap.get(itemType); if (sourceList != null && !sourceList.isEmpty()) { currentList.add(sourceList.stream() .filter(SynchronizableEntity::isPreservedObject) .findFirst() .orElse(null)); } } else { // 更新列表中的引用 SynchronizedList<SynchronizableEntity> sourceList = dataCollectionMap.get(itemType); if (sourceList != null) { for (int i = 0; i < currentList.size(); i++) { SynchronizableEntity item = currentList.get(i); if (item == null) continue; SynchronizableEntity found = sourceList.stream() .filter(e -> e.getId().equals(item.getId())) .findFirst() .orElse(null); // 如果找不到,使用预置对象作为回退 currentList.set(i, found != null ? found : sourceList.stream() .filter(SynchronizableEntity::isPreservedObject) .findFirst() .orElse(null)); } } } } } } } // 处理基本类型字段 else { Object value = f.get(t); if (value == null) { // 设置类型安全的默认值 if (String.class.equals(fieldType)) { f.set(t, "无"); } else if (Integer.class.equals(fieldType) || int.class.equals(fieldType)) { f.set(t, -1); } else if (Double.class.equals(fieldType) || double.class.equals(fieldType)) { f.set(t, -1.0); } else if (Boolean.class.equals(fieldType) || boolean.class.equals(fieldType)) { f.set(t, false); } else if (Date.class.equals(fieldType)) { f.set(t, new Date()); } } } } } } /** * 根据传入的Class对象创建对应类型的实例(加强值防护) */ public static <T> T createInstance(Class<T> clazz) { try { T instance = clazz.getDeclaredConstructor().newInstance(); // 设置默认值 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Class<?> type = field.getType(); if (type == String.class) { field.set(instance, "无"); } else if (type == Integer.class || type == int.class) { field.set(instance, -1); } else if (type == Double.class || type == double.class) { field.set(instance, -1.0); } else if (type == Boolean.class || type == boolean.class) { field.set(instance, false); } else if (type == Date.class) { field.set(instance, new Date()); } else if (SynchronizableEntity.class.isAssignableFrom(type)) { // 设置为对应类型的预置对象 SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(type); if (targetList != null && !targetList.isEmpty()) { field.set(instance, targetList.stream() .filter(SynchronizableEntity::isPreservedObject) .findFirst() .orElse(null)); } } else if (List.class.isAssignableFrom(type)) { // 初始化为列表 field.set(instance, new ArrayList<>()); } } // 设置特殊字段 clazz.getMethod("setId", Integer.class).invoke(instance, -1); clazz.getMethod("setState", SynchronizableEntity.SyncState.class) .invoke(instance, SynchronizableEntity.SyncState.PRESERVED); return instance; } catch (Exception e) { Log.e("Data", "创建实例失败: " + clazz.getName(), e); return createSafeFallback(clazz); } } // 安全回退创建 private static <T> T createSafeFallback(Class<T> clazz) { try { return clazz.getDeclaredConstructor().newInstance(); } catch (Exception ex) { throw new RuntimeException("创建回退实例失败", ex); } } // 辅助方法:确保列表不为null private static <T> void safeInitializeList(List<T> list) { if (list == null) { list = new ArrayList<>(); } } // 辅助方法:过滤列表中的值 private static <T> List<T> filterNulls(List<T> list) { if (list == null) return new ArrayList<>(); return list.stream() .filter(Objects::nonNull) .collect(Collectors.toList()); } // 回调接口 public interface LoadDataCallback { void onSuccess(); void onFailure(); } // 内部类用于解析JSON响应 public static class AllDataResponse { public List<Bancai> bancais; public List<Caizhi> caizhis; public List<Mupi> mupis; public List<Chanpin> chanpins; public List<Chanpin_Zujian> chanpin_zujians; public List<Dingdan> dingdans; public List<Dingdan_Chanpin> dingdan_chanpins; public List<Dingdan_chanpin_zujian> Dingdan_chanpin_zujians; public List<Kucun> kucuns; public List<Zujian> zujians; public List<User> users; public List<Jinhuo> jinhuos; } // 新增方法:设置所有实体状态 private static void setAllEntitiesState(SynchronizableEntity.SyncState state) { setListState(bancais, state); setListState(caizhis, state); setListState(mupis, state); setListState(Dingdan_chanpin_zujians, state); setListState(dingdans, state); setListState(chanpins, state); setListState(chanpin_zujians, state); setListState(zujians, state); setListState(jinhuos, state); setListState(kucuns, state); setListState(users, state); } private static <T extends SynchronizableEntity> void setListState(List<T> list, SynchronizableEntity.SyncState state) { for (T entity : list) { if (entity != null) { entity.setState(state); } } } }结构简化加入详细注释
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值