objectbox / objectbox/objectbox-java
io.objectbox.exception.FileCorruptException: Could not get from cursor (corrupted) (error code -30796)
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Java
- Star
- 4.6k
- Fork
- 311
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
In my Pre-launch report details I see continuously crashes on Android 8.1 phones. I cannot reproduce it on a Emulator with SDK 27. Stacktrace error (see for log details below): io.objectbox.exception.FileCorruptException: Could not get from cursor (corrupted) (error code -30796)
Is this a issue with pre-launch testing or might this occur on real devices as well? After searching I found multiple issues with Android 8.1. Any clue?
I'm using a read-only box from a fragment (write box is in a remote service).
- ObjectBox version 2.8.0 (but also on 2.7.1)
- Reproducibility: always on Android 8.1 devices for pre-launch report
- Device: e.g. Motorola moto e5 play and Nokia Nokia 1
- OS: Android 8.1
Code
Initialization done in MainActivity class after being connected to Service (remote process). The method initMainActivity is called.
protected void initMainActivity() {
if (!mInitMainActivity) {
JepsterManager jepsterManager = (JepsterManager) getApplication();
jepsterManager.initReadOnlyBox();
//Check if version is updated and update information has to be shown
JepsterVersionUtilities.checkVersion(this, mService, mPreferences);
//Check version to verify if preference migration is needed
PrefsMigrationUtilities.checkVersion(this, mPreferences);
setNavigationHeader();
mInitMainActivity = true;
//ObjectBox need to be available, JepsterService has to be started first to be able to update schema of Box.
if (mOnPostResume){
selectDrawerItem(mMenuItemId);
}
}
}
public class ObjectBox {
private static BoxStore boxStore;
private static int messageId = 0;
public static void init(Context context) {
if (boxStore == null) {
boxStore = MyObjectBox.builder()
.androidContext(context.getApplicationContext())
.androidReLinker(ReLinker.log(new ReLinker.Logger() {
@Override
public void log(String message) {
Log.d(Constants.TAG, message);
}
}))
.build();
if (BuildConfig.DEBUG) {
boolean started = new AndroidObjectBrowser(boxStore).start(context);
}
}
}
public static void initReadOnly(Context context) {
if (boxStore == null) {
boxStore = MyObjectBox.builder()
.androidContext(context.getApplicationContext())
.androidReLinker(ReLinker.log(new ReLinker.Logger() {
@Override
public void log(String message) {
Log.d(Constants.TAG, message);
}
}))
.readOnly()
.build();
if (BuildConfig.DEBUG) {
boolean started = new AndroidObjectBrowser(boxStore).start(context);
}
}
}
public static BoxStore get() {
return boxStore;
}
public static int getMessageId(){
messageId ++;
return messageId;
}
}
public int getDataFieldValue(int bike, int page, int dataField){
Box<BikeDataFieldEntity> bikeDataFieldBox = getBikeDataFieldBox();
//Search data field ID
QueryBuilder<BikeDataFieldEntity> builder = bikeDataFieldBox.query();
builder.equal(BikeDataFieldEntity_.bike, bike)
.equal(BikeDataFieldEntity_.page, page)
.equal(BikeDataFieldEntity_.dataField, dataField);
Query<BikeDataFieldEntity> query = builder.build();
BikeDataFieldEntity bikeDataField = query.findFirst(); (**Line 321**)
return bikeDataField.getDataFieldValue();
}
public Box<BikeDataFieldEntity> getBikeDataFieldBox(){
if (mBikeDataFieldBox == null){
mBikeDataFieldBox = ObjectBox.get().boxFor(BikeDataFieldEntity.class);
}
return mBikeDataFieldBox;
}
Logs, stack traces
io.objectbox.exception.FileCorruptException: Could not get from cursor (corrupted) (error code -30796)
at io.objectbox.query.Query.nativeFindFirst(Native Method)
at io.objectbox.query.Query.lambda$findFirst$0$Query(Query.java:153)
at io.objectbox.query.-$$Lambda$Query$U3Pw2NlOHcqDE3imeFDwfgwkeJw.call(Unknown Source:2)
at io.objectbox.BoxStore.callInReadTx(BoxStore.java:813)
at io.objectbox.BoxStore.callInReadTxWithRetry(BoxStore.java:759)
at io.objectbox.query.Query.callInReadTx(Query.java:275)
at io.objectbox.query.Query.findFirst(Query.java:151)
at com.twom.bico.pages.FragmentPageDataFields.getDataFieldValue(FragmentPageDataFields.java:321)
at com.twom.bico.pages.FragmentPageDataFields.initViews(FragmentPageDataFields.java:111)
at com.twom.bico.pages.FragmentPage9DataFields.onCreateView(FragmentPage9DataFields.java:31)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:270)
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
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 với stack trace tại dòng 321 của FragmentPageDataFields.java và so sánh quá trình khởi tạo chỉ đọc trong ObjectBox.initReadOnly với việc thiết lập dịch vụ từ xa. Tái hiện truy vấn trên các thiết bị Android 8.1 hoặc trong môi trường pre-launch bằng cách sử dụng thông tin chi tiết về thiết bị và các log được cung cấp. Được xem là hoàn tất khi xác định được liệu lỗi hỏng dữ liệu chỉ giới hạn trong quá trình kiểm thử pre-launch hay có thể xảy ra trên thiết bị thực tế, kèm theo nguyên nhân được ghi lại hoặc bước chẩn đoán tiếp theo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- android, java
- 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
- Cần làm rõ
- Mức phù hợp với người mới
- 25/100