Storage Migration

Migrate data between storage formats

JavaScriptAdvanced
JavaScript
// Method 1: Simple migration
function migrateStorage() {
    const oldData = localStorage.getItem('oldKey');
    if (oldData) {
        // Migrate to new format
        const newData = {
            version: 2,
            data: JSON.parse(oldData)
        };
        localStorage.setItem('newKey', JSON.stringify(newData));
        localStorage.removeItem('oldKey');
        console.log('Migration complete');
    }
}

// Method 2: Version-based migration
const STORAGE_VERSION = 2;

function checkAndMigrate() {
    const currentVersion = localStorage.getItem('storageVersion');
    
    if (!currentVersion || parseInt(currentVersion) < STORAGE_VERSION) {
        console.log('Migration needed');
        migrateToVersion(parseInt(currentVersion) || 1);
        localStorage.setItem('storageVersion', STORAGE_VERSION.toString());
    }
}

function migrateToVersion(fromVersion) {
    if (fromVersion === 1) {
        // Migrate from v1 to v2
        const v1Data = localStorage.getItem('userData');
        if (v1Data) {
            const data = JSON.parse(v1Data);
            const v2Data = {
                ...data,
                metadata: {
                    createdAt: new Date().toISOString(),
                    version: 2
                }
            };
            localStorage.setItem('userData', JSON.stringify(v2Data));
        }
    }
}

checkAndMigrate();

// Method 3: Migration with backup
function migrateWithBackup() {
    // Create backup
    const backup = {};
    for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i);
        backup[key] = localStorage.getItem(key);
    }
    localStorage.setItem('backup_' + Date.now(), JSON.stringify(backup));
    
    // Perform migration
    try {
        migrateStorage();
        console.log('Migration successful');
    } catch (e) {
        console.error('Migration failed, restoring backup');
        // Restore from backup
        restoreBackup(backup);
    }
}

function restoreBackup(backup) {
    localStorage.clear();
    Object.keys(backup).forEach(key => {
        localStorage.setItem(key, backup[key]);
    });
}

// Method 4: Progressive migration
function progressiveMigration() {
    const migrationSteps = [
        () => migrateStep1(),
        () => migrateStep2(),
        () => migrateStep3()
    ];
    
    migrationSteps.forEach((step, index) => {
        try {
            step();
            console.log(`Step ${index + 1} complete`);
        } catch (e) {
            console.error(`Step ${index + 1} failed:`, e);
            throw e;
        }
    });
}

function migrateStep1() {
    // Step 1 logic
}

function migrateStep2() {
    // Step 2 logic
}

function migrateStep3() {
    // Step 3 logic
}

// Method 5: Data transformation
function transformData(oldFormat) {
    // Transform old format to new format
    return {
        id: oldFormat.userId,
        name: oldFormat.fullName,
        email: oldFormat.emailAddress,
        settings: {
            theme: oldFormat.theme || 'light',
            notifications: oldFormat.notify || true
        }
    };
}

function migrateUserData() {
    const oldData = localStorage.getItem('oldUserData');
    if (oldData) {
        const parsed = JSON.parse(oldData);
        const newData = transformData(parsed);
        localStorage.setItem('userData', JSON.stringify(newData));
        localStorage.removeItem('oldUserData');
    }
}

Output

Migration complete
Migration needed
Step 1 complete
Step 2 complete
Step 3 complete

Migration updates storage format.

Migration Strategies

  • Version-based
  • Backup before migrate
  • Progressive steps
  • Data transformation

Best Practices

  • Check version
  • Create backups
  • Test migrations
  • Handle errors

Use Cases

  • Schema changes
  • Format updates
  • Data restructuring
  • Version upgrades

Important

  • Always backup
  • Test thoroughly
  • Handle failures
  • Document changes