DishCatalogRepository 是项目内菜品基础资料的统一入口,负责把服务端菜品列表同步到本地,并向识别、管理、替换菜品等业务页面提供按菜品编码查询的能力。
核心职责:
dishUuid / 菜品学习编码查询 DishBeandishId 兜底查询旧数据或数字编码app/src/main/java/com/cpt/aidishrecognition/utils/DishCatalogRepository.javaapp/src/main/java/com/cpt/aidishrecognition/utils/DishCatalogDatabaseHelper.javaapp/src/main/java/com/cpt/aidishrecognition/utils/DishLearningStore.javaapp/src/main/java/com/cpt/aidishrecognition/network/model/DishBean.java应用启动时,CptApplication.onCreate() 会调用:
DishCatalogRepository.getInstance().initializeAndWarmUp(this);
当前实现会完成:
DishCatalogDatabaseHelperdish_catalog.dbdish_catalog 表dishCache说明:
initializeAndWarmUp() 里目前没有自动请求服务端同步,自动同步调用被注释掉。syncIfNeededAsync()。主动全量同步入口:
DishCatalogRepository.getInstance().syncAllAsync(context, callback);
同步前置条件:
Constants.DEVICE_CODE同步过程:
RetrofitRequest.getDishList(...)3000 条replaceAll(...)dish_catalog 表dishCachedish_catalog_last_sync_timeSyncCallback 回到主线程通知结果按需同步入口:
DishCatalogRepository.getInstance().syncIfNeededAsync(context, callback);
默认同步间隔是 6 小时。如果距离上次同步未超过 6 小时,并且内存缓存不为空,就直接回调成功,不再请求接口。
本地数据库:
dish_catalog.dbdish_catalogdish_uuid主要字段:
dish_uuid:菜品业务编码,优先来自 dishUuiddish_id:菜品数字 IDdish_name:菜品名称dish_price:菜品价格dish_unit:菜品单位dish_image_path:菜品图片地址energy_per_100g:每 100g 能量carbohydrate_per_100g:每 100g 碳水protein_per_100g:每 100g 蛋白质fat_per_100g:每 100g 脂肪dietary_fiber_per_100g:每 100g 膳食纤维tag_*:菜品营养标签信息updated_at:本地写入时间常用查询入口:
DishCatalogRepository.getInstance().findDishByGoodsCode(goodsCode);
查询顺序:
goodsCode 为空,直接返回 nulldishCachedish_uuid 查询 SQLitedish_id 兜底查询 SQLite这个方法主要服务于:
仓库保存和查询时都使用:
DishLearningStore.resolveDishCode(dish)
编码规则:
dishUuiddishUuid 为空,则回退使用 dishId 字符串因此,DishCatalogRepository 中的 goodsCode 本质上就是菜品学习和识别流程中的统一菜品编码。
DishCatalogDatabaseHelper 表结构DishCatalogRepository.toContentValues(...)DishCatalogRepository.fromCursor(...)DishLearningStore.resolveDishCode(...),保持学习、识别、管理、查询逻辑一致。replaceAll(...) 是全量替换策略,同步成功后会删除旧目录并写入新目录。SyncCallback 已通过 mainHandler 切回主线程,页面回调中可以直接更新 UI。AtomicBoolean syncing 控制,同一时间只允许一个菜品目录同步任务。