如何使用Dexie导出指定关联事件的trialTable数据?
解决Dexie导出指定关联trial数据及filter参数说明
一、实现选中事件关联trial数据的过滤导出
你已经引入dexie-export-import和downloadjs,只需在exportDB配置中通过filter函数精准过滤即可。假设你已拿到用户选中的事件ID数组(比如selectedEventIds = [1,3,5]),代码示例如下:
import { exportDB } from 'dexie-export-import'; import download from 'downloadjs'; // 假设你的Dexie实例为db async function exportSelectedTrials(selectedEventIds) { try { const exportedBlob = await exportDB(db, { // 仅导出trial表(按需配置,不需要导出event表时加上) tables: ['trial'], filter: (value, key, table) => { // 只处理trial表,保留fk_event在选中ID列表中的行 if (table.name === 'trial') { return selectedEventIds.includes(value.fk_event); } // 其他表若存在,返回true表示全量导出,可按需调整 return true; } }); // 触发下载 download(exportedBlob, `selected-trials-${Date.now()}.json`, 'application/json'); } catch (err) { console.error('导出失败:', err); } }
二、exportDB中filter参数的value和key含义
value: 当前遍历到的完整表行数据对象,比如在trial表中,它包含fk_event、主键及其他所有字段的trial记录,你可以直接通过value.fk_event获取关联事件ID做判断。key: 当前行数据的主键值,如果你的trial表主键是id,那key就是这条trial记录的id值,这个参数适合需要通过主键过滤的场景,本次需求用value.fk_event即可满足。- 第三个参数
table是当前遍历的表对象,通过table.name可区分不同表,避免误过滤其他表数据。
三、导出后删除对应数据
导出完成后,建议先删除关联的trial数据,再删除选中的event数据(避免外键关联逻辑问题):
async function deleteSelectedData(selectedEventIds) { try { await db.transaction('rw', db.trial, db.event, async () => { // 删除所有关联的trial数据 await db.trial.where('fk_event').anyOf(selectedEventIds).delete(); // 删除选中的event数据 await db.event.where('id').anyOf(selectedEventIds).delete(); }); console.log('数据删除成功'); } catch (err) { console.error('删除失败:', err); } }
// 调用示例:先导出再删除
exportSelectedTrials([1]).then(() => {
deleteSelectedData([1]);
});
内容的提问来源于stack exchange,提问作者Cynthia
相关产品推荐
相关产品推荐

