Commit f95cb106 authored by fallenstardust's avatar fallenstardust

修复上传卡组时未上传decktype的问题

回滚同步修改
parent 429190da
......@@ -6,9 +6,8 @@ import android.widget.Toast;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
......@@ -192,6 +191,7 @@ public class DeckSquareApiUtil {
String deckContent = DeckSquareFileUtil.setDeckId(myDeckItem.getDeckPath(), loginToken.getUserId(), deckIdList.get(i));
PushMultiDeck.DeckData data = new PushMultiDeck.DeckData();
data.setDeckYdk(deckContent);
data.setDeckType(myDeckItem.getDeckType());
data.setDeckName(myDeckItem.getDeckName());
data.setDeckCoverCard1(myDeckItem.getDeckCoverCard1());
data.setDeckId(deckIdList.get(i));
......@@ -435,37 +435,35 @@ public class DeckSquareApiUtil {
DeckManagerFragment.getOriginalData().clear();
DeckManagerFragment.getOriginalData().addAll(onlineDecks);
// 创建在线卡组映射 name_type -> onlineDeck 用于快速查找
Map<String, MyOnlineDeckDetail> onlineDeckMap = new HashMap<>();
for (MyOnlineDeckDetail onlineDeck : onlineDecks) {
String key = (onlineDeck.getDeckType() != null ? onlineDeck.getDeckType() : "") + "_" + (onlineDeck.getDeckName() != null ? onlineDeck.getDeckName() : "");
onlineDeckMap.put(key, onlineDeck);
}
// 遍历本地卡组与云备份卡组,过滤差异项
// 遍历本地卡组与云备份卡组,过滤差异项(使用迭代器避免ConcurrentModificationException)
List<MyDeckItem> syncUploadDecks = new ArrayList<>();
// 1. 使用本地卡组的迭代器遍历(支持安全删除)
Iterator<MyDeckItem> localIterator = localDecks.iterator();
while (localIterator.hasNext()) {
MyDeckItem localDeck = localIterator.next();
// 预处理本地卡组
String rawLocalName = localDeck.getDeckName();
String localDeckName = rawLocalName.replace(Constants.YDK_FILE_EX, "");
String localDeckName = localDeck.getDeckName().replace(Constants.YDK_FILE_EX, "");
localDeck.setDeckName(localDeckName);
localDeck.setDeckCoverCard1(DeckUtil.getFirstCardCode(localDeck.getDeckPath()));
localDeck.setDelete(false);
LogUtil.d(TAG, "本地卡组名称:" + localDeck.getDeckType() + "-" + localDeck.getDeckName() + " 和 ID:" + localDeck.getDeckId());
String localKey = (localDeck.getDeckType() != null ? localDeck.getDeckType() : "") + "_" + (rawLocalName != null ? rawLocalName : "");
MyOnlineDeckDetail matchedOnlineDeck = onlineDeckMap.remove(localKey); // 移除已匹配项防止重复处理
if (matchedOnlineDeck != null) {
localDeck.setDeckId(matchedOnlineDeck.getDeckId());
LogUtil.e(TAG,"本地卡组名称:"+localDeck.getDeckType()+"-"+localDeck.getDeckName()+" ID:"+localDeck.getDeckId());
// 2. 使用在线卡组的迭代器遍历(支持安全删除)
Iterator<MyOnlineDeckDetail> onlineIterator = onlineDecks.iterator();
while (onlineIterator.hasNext()) {
MyOnlineDeckDetail onlineDeck = onlineIterator.next();
String onLineDeckName = onlineDeck.getDeckName().replace(Constants.YDK_FILE_EX, "");
LogUtil.e(TAG,"在线备份名称:"+onlineDeck.getDeckType()+"/"+onLineDeckName+" 在线卡组ID:"+onlineDeck.getDeckId());
// 匹配到同名卡组:加入同步上传列表,并从原始集合中删除(避免重复处理)
if (localDeckName.equals(onLineDeckName)) {// && localDeck.getDeckType().equals(onlineDeck.getDeckType())
localDeck.setDeckId(onlineDeck.getDeckId());
syncUploadDecks.add(localDeck);
localIterator.remove(); // 安全删除本地卡组
localIterator.remove(); // 安全删除本地卡组(迭代器方法)
onlineIterator.remove(); // 安全删除在线卡组(迭代器方法)
break; // 匹配后跳出内部循环
}
}
// 若未匹配到在线卡组,该本地卡组会保留在localDecks中(后续作为新卡组上传)
}
// 上传本地卡组覆盖在线卡组
......@@ -481,40 +479,24 @@ public class DeckSquareApiUtil {
// 剩余的在线卡组都是云端独有,需要下载
LogUtil.i(TAG, "剩余onlineDecks:" + onlineDecks);
for (MyOnlineDeckDetail onlineDeck : onlineDecks) {
LogUtil.d(TAG, "+要下载的 云备份卡组: \n卡组分类:" + onlineDeck.getDeckType()
+ "\n卡组名:" + onlineDeck.getDeckName() + "\n卡组id:" + onlineDeck.getDeckId());
LogUtil.d(TAG, "synchronizeDecks +要下载的 云备份卡组: \n卡组分类:" + onlineDeck.getDeckType() + "\n卡组名:" + onlineDeck.getDeckName() + "\n卡组id:" + onlineDeck.getDeckId());
// 确保文件名包含.ydk扩展名
String fileName = onlineDeck.getDeckName();
if (!fileName.toLowerCase().endsWith(Constants.YDK_FILE_EX)) {
fileName += Constants.YDK_FILE_EX;
}
String baseDir = AppsSettings.get().getDeckDir();
if (baseDir == null) {
LogUtil.e(TAG, "Deck directory is not configured.");
continue;
}
String fileFullPath = AppsSettings.get().getDeckDir() + "/" + fileName;
if (!onlineDeck.getDeckType().equals(""))
fileFullPath = AppsSettings.get().getDeckDir() + "/" + onlineDeck.getDeckType() + "/" + fileName;
Path filePath;
if (!onlineDeck.getDeckType().isEmpty()) {
filePath = Paths.get(baseDir, onlineDeck.getDeckType(), fileName);
} else {
filePath = Paths.get(baseDir, fileName);
}
String fileFullPath = filePath.toString();
try {
// 保存在线卡组到本地
boolean saved = DeckSquareFileUtil.saveFileToPath(fileFullPath, onlineDeck.getDeckYdk(), onlineDeck.getDeckUpdateDate());
if (!saved) {
LogUtil.e(TAG, "synchronizeDecks 保存失败!的 云备份卡组: " + fileFullPath);
} else {
LogUtil.d(TAG, "synchronizeDecks 保存成功√的 云备份卡组: " + fileFullPath);
}
} catch (Exception e) {
LogUtil.e(TAG, "Failed to save deck file: " + fileFullPath, e);
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment