objectbox / objectbox/objectbox-dart
Issue with Store.attach() throwing UnsupportedError on iOS physical device
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Dart
- Star
- 1.2k
- Fork
- 162
- Merge trung bình
- 15 phút
- Pull request đã merge (30 ngày)
- 1
Mô tả
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!
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện luồng thông báo nền trên một thiết bị iOS vật lý, tập trung vào createStore(), openStore() và Store.attach() trong trình xử lý nền của Firebase. So sánh vòng đời của store và hành vi của isolate với Android; công việc được xem là hoàn tất khi nguyên nhân của UnsupportedError do nhiều store đã được xác định và một cách giải quyết đã được xác minh hoặc một giới hạn được ghi nhận trong tài liệu đã được cung cấp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- dart, firebase, flutter
- Lĩnh vực
- database, mobile
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 38/100