objectbox / objectbox/objectbox-dart
Issue with Store.attach() throwing UnsupportedError on iOS physical device
Nobody has claimed this yet.
- Dominant language
- Dart
- Stars
- 1.2k
- Forks
- 162
- Avg merge
- 15m
- Merged PRs (30d)
- 1
Description
Hello,
I am using the objectbox-dart library in my Flutter application, which also utilizes Firebase Cloud Messaging for background notifications. When handling notifications in the background on a physical iOS device, I encounter an exception when calling the Store.attach() method. This issue does not occur on an Android emulator.
Here is how I use the library:
Future<String> getDatabaseDirectoryPath() async {
final dir = await getApplicationDocumentsDirectory();
return '${dir.path}${Platform.pathSeparator}objectbox';
}
static Future<Store> tryOpenStore(String dbPath,
{required int maxRetries}) async {
try {
if (maxRetries > 0) {
return await openStore(directory: dbPath);
} else {
const exceptionMessage =
"Couldn't open store because of recurring SchemaExceptions.";
globalLogger.i(exceptionMessage);
throw Exception(exceptionMessage);
}
} on SchemaException catch (_) {
maxRetries--;
await deleteDatabaseFiles(dbPath);
return await tryOpenStore(dbPath, maxRetries: maxRetries);
}
}
static Future<Store> createStore() async {
final dbPath = await getDatabaseDirectoryPath();
final isOpen = Store.isOpen(dbPath);
if (isOpen) {
final store = Store.attach(getObjectBoxModel(), dbPath);
return store;
} else {
final store = await tryOpenStore(dbPath, maxRetries: 2);
return store;
}
}
The crash occurs in an event triggered when the application is in the background (receiving a Firebase notification):
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// Initialize some stuff here…
final store = await RubisObjectBox.createStore(); // works on Android, not on iOS
MessagingHelper.handleMessage(
DataMessage.fromJson(message.data), message.data, store, runFromBackground: true
);
}
On iOS, the Store.attach() method throws an UnsupportedError with the message:
Cannot create multiple Store instances for the same directory in the same isolate. Please use a single Store, close() the previous instance before opening another one or attach to it in another isolate.
I tried using Isolate.run to return the store, but it seems not possible since the getApplicationDocumentsDirectory() method cannot be called within an isolate.
Environment:
- Flutter version: 3.22.2
- Dart version: 3.4.3
- objectbox version: ^4.0.1
- For the Android Platform, I used an Emulator directly on Android Studio (Pixel_3a_API_34_extension_level_7_x86_64)
- For the iOS Platform, I used a Physical Device (iPhone 11 with iOS version 17.5.1)
Steps to reproduce:
- Set up a Flutter application using objectbox 4.0.1
- Create a store with the method
openStore() - Get a new instance of the same store using
attach()without closing the previous store - Observe the exception.
Any guidance or solution for this issue would be greatly appreciated. Thank you!
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the background notification flow on a physical iOS device, focusing on createStore(), openStore(), and Store.attach() in the Firebase background handler. Compare the store lifecycle and isolate behavior with Android; done means the cause of the multiple-store UnsupportedError is identified and a verified resolution or documented limitation is provided.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- dart, firebase, flutter
- Domain
- database, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100