Here's a migration script to copy all values from AsyncStorage to MMKV, and delete them from AsyncStorage afterwards.
storage.ts |
import AsyncStorage from '@react-native-async-storage/async-storage';
import { createMMKV } from 'react-native-mmkv';
export const storage = createMMKV();
// TODO: Remove `hasMigratedFromAsyncStorage` after a while (when everyone has migrated)
export const hasMigratedFromAsyncStorage = storage.getBoolean(
'hasMigratedFromAsyncStorage',
);
// TODO: Remove `hasMigratedFromAsyncStorage` after a while (when everyone has migrated)
export async function migrateFromAsyncStorage(): Promise<void> {
console.log('Migrating from AsyncStorage -> MMKV...');
const start = global.performance.now();
const keys = await AsyncStorage.getAllKeys();
for (const key of keys) {
try {
const value = await AsyncStorage.getItem(key);
if (value != null) {
if (['true', 'false'].includes(value)) {
storage.set(key, value === 'true');
} else {
storage.set(key, value);
}
AsyncStorage.removeItem(key);
}
} catch (error) {
console.error(
`Failed to migrate key "${key}" from AsyncStorage to MMKV!`,
error,
);
throw error;
}
}
storage.set('hasMigratedFromAsyncStorage', true);
const end = global.performance.now();
console.log(`Migrated from AsyncStorage -> MMKV in ${end - start}ms!`);
}
|
App.tsx |
...
import { hasMigratedFromAsyncStorage, migrateFromAsyncStorage } from './storage';
...
export default function App() {
// TODO: Remove `hasMigratedFromAsyncStorage` after a while (when everyone has migrated)
const [hasMigrated, setHasMigrated] = useState(hasMigratedFromAsyncStorage);
...
useEffect(() => {
if (!hasMigratedFromAsyncStorage) {
InteractionManager.runAfterInteractions(async () => {
try {
await migrateFromAsyncStorage()
setHasMigrated(true)
} catch (e) {
// TODO: fall back to AsyncStorage? Wipe storage clean and use MMKV? Crash app?
}
});
}
}, []);
if (!hasMigrated) {
// show loading indicator while app is migrating storage...
return (
<View style={{ justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator color="black" />
</View>
);
}
return (
<YourAppsCode />
);
}
|