objectbox / objectbox/objectbox-java
io.objectbox.exception.FileCorruptException: Could not get from cursor (corrupted) (error code -30796)
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Java
- Sterne
- 4.6k
- Forks
- 311
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
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)
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem Stack Trace in FragmentPageDataFields.java, Zeile 321, und vergleiche die schreibgeschützte Initialisierung in ObjectBox.initReadOnly mit der Einrichtung des Remote-Dienstes. Reproduziere die Abfrage auf Android-8.1-Geräten oder in der Pre-Launch-Umgebung anhand der bereitgestellten Gerätedetails und Logs. Als erledigt gilt, wenn festgestellt wurde, ob die Beschädigung auf Pre-Launch-Tests beschränkt ist oder auf echten Geräten auftreten kann, und eine dokumentierte Ursache oder der nächste Diagnoseschritt vorliegt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- android, java
- Bereich
- database, mobile
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100