概述跨库迁移常伴随字段重命名与结构调整。本文给出标准迁移流程。迁移脚本function openDB(name, version, upgrade) { return new Promise((resolve, reject) => { const r = indexedDB.open(name, version); r.onupgradeneeded = e => upgrade && upgrade(r.result, e.oldVersion, e.newVersion); r.onsuccess = () => resolve(r.result); r.onerror = () => reject(r.error); }); }
async function migrate(srcName, dstName) {
const src = await openDB(srcName);
const dst = await openDB(dstName, 1, db => { if (!db.objectStoreNames.contains('items')) db.createObjectStore('items', { keyPath: 'id' }); });
const stx = src.transaction(src.objectStoreNames[0], 'readonly');
const s = stx.objectStore(src.objectStoreNames[0]);
const req = s.openCursor();
await new Promise((resolve, reject) => {
req.onsuccess = async e => {
const c = e.target.result;
if (c) {
const v = c.value;
const norm = { id: v.id, name: v.name?.trim() || '', updatedAt: v.updatedAt || Date.now() };
const dtx = dst.transaction('items','readwrite');
dtx.objectStore('items').put(norm);
await new Promise((res, rej) => { dtx.oncomplete = res; dtx.onerror = () => rej(dtx.error); });
c.continue();
} else resolve();
};
req.onerror = () => reject(req.error);
});
src.close(); dst.close();
}

发表评论 取消回复