--- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncLocalStorageUtil.java +++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncLocalStorageUtil.java @@ -159,7 +159,9 @@ public class AsyncLocalStorageUtil { } File nextStorageFile = ctx.getDatabasePath("AsyncStorage"); - File currentStorageFile = ctx.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME); + // NOTE(kudo): Expo Go doesn't turn on next storage, having dummy db name to pass build + // File currentStorageFile = ctx.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME); + File currentStorageFile = ctx.getDatabasePath("UNUSED"); boolean isCheckpointRequired = !nextStorageFile.exists() && currentStorageFile.exists(); if (!isCheckpointRequired) { Log.i("AsyncStorage_Next", "SQLite checkpoint not required."); --- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageExpoMigration.java +++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageExpoMigration.java @@ -38,7 +38,8 @@ public class AsyncStorageExpoMigration { try { // Create the storage file ReactDatabaseSupplier.getInstance(context).get(); - copyFile(new FileInputStream(expoDatabase), new FileOutputStream(context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME))); + // NOTE(kudo): Don't run migration on Expo Go for backward compatibility + // copyFile(new FileInputStream(expoDatabase), new FileOutputStream(context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME))); Log.v(LOG_TAG, "Migrated most recently modified database " + expoDatabase.getName() + " to RKStorage"); } catch (Exception e) { Log.v(LOG_TAG, "Failed to migrate scoped database " + expoDatabase.getName()); @@ -62,7 +63,9 @@ public class AsyncStorageExpoMigration { } private static boolean isAsyncStorageDatabaseCreated(Context context) { - return context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME).exists(); + // NOTE(kudo): Don't run migration on Expo Go for backward compatibility + // return context.getDatabasePath(ReactDatabaseSupplier.DATABASE_NAME).exists(); + return true; } // Find all database files that the user may have created while using Expo. --- android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageModule.java +++ android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageModule.java @@ -33,7 +33,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; @ReactModule(name = AsyncStorageModule.NAME) -public final class AsyncStorageModule +public class AsyncStorageModule extends ReactContextBaseJavaModule implements ModuleDataCleaner.Cleanable, LifecycleEventListener { // changed name to not conflict with AsyncStorage from RN repo @@ -43,7 +43,7 @@ public final class AsyncStorageModule // https://raw.githubusercontent.com/android/platform_external_sqlite/master/dist/sqlite3.c private static final int MAX_SQL_KEYS = 999; - private ReactDatabaseSupplier mReactDatabaseSupplier; + public ReactDatabaseSupplier mReactDatabaseSupplier; private boolean mShuttingDown = false; private final SerialExecutor executor; @@ -66,7 +66,8 @@ public final class AsyncStorageModule this.executor = new SerialExecutor(executor); reactContext.addLifecycleEventListener(this); // Creating the database MUST happen after the migration. - mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(reactContext); + // NOTE(kudo): ExponentAsyncStorageModule will setup the `mReactDatabaseSupplier` + mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(reactContext); } @Override --- android/src/main/java/com/reactnativecommunity/asyncstorage/ReactDatabaseSupplier.java +++ android/src/main/java/com/reactnativecommunity/asyncstorage/ReactDatabaseSupplier.java @@ -22,7 +22,9 @@ import javax.annotation.Nullable; public class ReactDatabaseSupplier extends SQLiteOpenHelper { // VisibleForTesting - public static final String DATABASE_NAME = "RKStorage"; + // NOTE(kudo): Dynamic database name for scoped async storage + // public static final String DATABASE_NAME = "RKStorage"; + public String DATABASE_NAME = "RKStorage"; private static final int DATABASE_VERSION = 1; private static final int SLEEP_TIME_MS = 30; @@ -44,8 +46,19 @@ public class ReactDatabaseSupplier extends SQLiteOpenHelper { private long mMaximumDatabaseSize = BuildConfig.AsyncStorage_db_size * 1024L * 1024L; private ReactDatabaseSupplier(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); + // NOTE(kudo): Dynamic database name for scoped async storage + // super(context, databaseName, null, DATABASE_VERSION); + // mContext = context; + super(context, "RKStorage", null, DATABASE_VERSION); mContext = context; + DATABASE_NAME = "RKStorage"; + } + + // NOTE(kudo): Dynamic database name for scoped async storage + public ReactDatabaseSupplier(Context context, String databaseName) { + super(context, databaseName, null, DATABASE_VERSION); + mContext = context; + DATABASE_NAME = databaseName; } public static ReactDatabaseSupplier getInstance(Context context) {