1--- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncLocalStorageUtil.java 2+++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncLocalStorageUtil.java 3@@ -159,7 +159,9 @@ public class AsyncLocalStorageUtil { 4 } 5 6 File nextStorageFile = ctx.getDatabasePath("AsyncStorage"); 7- File currentStorageFile = ctx.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME); 8+ // NOTE(kudo): Expo Go doesn't turn on next storage, having dummy db name to pass build 9+ // File currentStorageFile = ctx.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME); 10+ File currentStorageFile = ctx.getDatabasePath("UNUSED"); 11 boolean isCheckpointRequired = !nextStorageFile.exists() && currentStorageFile.exists(); 12 if (!isCheckpointRequired) { 13 Log.i("AsyncStorage_Next", "SQLite checkpoint not required."); 14--- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageExpoMigration.java 15+++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageExpoMigration.java 16@@ -38,7 +38,8 @@ public class AsyncStorageExpoMigration { 17 try { 18 // Create the storage file 19 ReactDatabaseSupplier.getInstance(context).get(); 20- copyFile(new FileInputStream(expoDatabase), new FileOutputStream(context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME))); 21+ // NOTE(kudo): Don't run migration on Expo Go for backward compatibility 22+ // copyFile(new FileInputStream(expoDatabase), new FileOutputStream(context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME))); 23 Log.v(LOG_TAG, "Migrated most recently modified database " + expoDatabase.getName() + " to RKStorage"); 24 } catch (Exception e) { 25 Log.v(LOG_TAG, "Failed to migrate scoped database " + expoDatabase.getName()); 26@@ -62,7 +63,9 @@ public class AsyncStorageExpoMigration { 27 } 28 29 private static boolean isAsyncStorageDatabaseCreated(Context context) { 30- return context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME).exists(); 31+ // NOTE(kudo): Don't run migration on Expo Go for backward compatibility 32+ // return context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME).exists(); 33+ return true; 34 } 35 36 // Find all database files that the user may have created while using Expo. 37--- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageModule.java 38+++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageModule.java 39@@ -33,7 +33,7 @@ import java.util.concurrent.Executor; 40 import java.util.concurrent.Executors; 41 42 @ReactModule(name = AsyncStorageModule.NAME) 43-public final class AsyncStorageModule 44+public class AsyncStorageModule 45 extends ReactContextBaseJavaModule implements ModuleDataCleaner.Cleanable, LifecycleEventListener { 46 47 // changed name to not conflict with AsyncStorage from RN repo 48@@ -43,7 +43,7 @@ public final class AsyncStorageModule 49 // https://raw.githubusercontent.com/android/platform_external_sqlite/master/dist/sqlite3.c 50 private static final int MAX_SQL_KEYS = 999; 51 52- private ReactDatabaseSupplier mReactDatabaseSupplier; 53+ public ReactDatabaseSupplier mReactDatabaseSupplier; 54 private boolean mShuttingDown = false; 55 56 private final SerialExecutor executor; 57@@ -66,7 +66,8 @@ public final class AsyncStorageModule 58 this.executor = new SerialExecutor(executor); 59 reactContext.addLifecycleEventListener(this); 60 // Creating the database MUST happen after the migration. 61- mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(reactContext); 62+ // NOTE(kudo): ExponentAsyncStorageModule will setup the `mReactDatabaseSupplier` 63+ mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(reactContext); 64 } 65 66 @Override 67--- android/src/main/java/com/reactnativecommunity/asyncstorage/ReactDatabaseSupplier.java 68+++ android/src/main/java/com/reactnativecommunity/asyncstorage/ReactDatabaseSupplier.java 69@@ -22,7 +22,9 @@ import javax.annotation.Nullable; 70 public class ReactDatabaseSupplier extends SQLiteOpenHelper { 71 72 // VisibleForTesting 73- public static final String DATABASE_NAME = "RKStorage"; 74+ // NOTE(kudo): Dynamic database name for scoped async storage 75+ // public static final String DATABASE_NAME = "RKStorage"; 76+ public String DATABASE_NAME = "RKStorage"; 77 78 private static final int DATABASE_VERSION = 1; 79 private static final int SLEEP_TIME_MS = 30; 80@@ -44,8 +46,19 @@ public class ReactDatabaseSupplier extends SQLiteOpenHelper { 81 private long mMaximumDatabaseSize = BuildConfig.AsyncStorage_db_size * 1024L * 1024L; 82 83 private ReactDatabaseSupplier(Context context) { 84- super(context, DATABASE_NAME, null, DATABASE_VERSION); 85+ // NOTE(kudo): Dynamic database name for scoped async storage 86+ // super(context, databaseName, null, DATABASE_VERSION); 87+ // mContext = context; 88+ super(context, "RKStorage", null, DATABASE_VERSION); 89 mContext = context; 90+ DATABASE_NAME = "RKStorage"; 91+ } 92+ 93+ // NOTE(kudo): Dynamic database name for scoped async storage 94+ public ReactDatabaseSupplier(Context context, String databaseName) { 95+ super(context, databaseName, null, DATABASE_VERSION); 96+ mContext = context; 97+ DATABASE_NAME = databaseName; 98 } 99 100 public static ReactDatabaseSupplier getInstance(Context context) { 101