db4o на Android 4.4.+: не удается сохранить объект, так как невозможно выполнить длинное преобразование в целое число

При работе с библиотекой db4o (8.1-SNAPSHOT и 8.0) открытие базы данных работает

oc = Db4oEmbedded.openFile(dbConfig(), db4oDBFullPath(context)); //context.getDir("data", 0) + "/" + "mDB.DB4O"; to get the full path

Однако, как только я начинаю пытаться сохранить объект

oc.store(объект)

Я получаю сообщение об ошибке cannot cast java.lang.Long to java.lang.Integer. Эта проблема, вероятно, вызвана новой реализацией dalvik для новых версий ОС Android, но доступны ли какие-либо исправления или обходные пути для этой ошибки?

Парень представлял патч здесь, но он недоступен.

Полный стек ошибки

Обновлять:

Итак, после трассировки ошибки выясняется, что внутри com.db4o.internal.DalvikVM в версии 8.0 происходит ужасное приведение типов из Long в Integer.

интервал _methodId; _methodId = (Целое число)structorIdMethod.invoke(null, Object.class);

Я попытался исправить это, объявив переменную as long. Я перекомпилировал и снова запустил на Android, я получил еще одну ошибку, которая UnsupportedOperationException: java.lang.NoSuchMethodException: newInstance [class java.lang.Class, int]

Вызвано этим:

Любая подсказка, как решить эту проблему?

        try {
            _method = ObjectStreamClass.class.getDeclaredMethod("newInstance", Class.class, Integer.TYPE); 
            _method.setAccessible(true);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e);
        } 
    }

Мне удалось это исправить, создав патч в коде db4o 8.1.


person Mohamed Taher Alrefaie    schedule 25.07.2014    source источник
comment
@Machinarius, посмотри на трассировку стека? Далвик точно.   -  person Machinarius    schedule 26.07.2014
comment
Я бы не стал считать это верным доказательством того, что телефон работает на Dalvik. Проверьте настройки разработчика.   -  person Mohamed Taher Alrefaie    schedule 26.07.2014
comment
Я проверил телефон, и он показывает, что это Dalvik.   -  person Machinarius    schedule 26.07.2014
comment
Хм, тогда без понятия, извините   -  person Mohamed Taher Alrefaie    schedule 26.07.2014
comment
@Machinarius, я нашел ошибку, ее нет в Dalvik. Это внутренняя ошибка в db4o. Выкладываю обновление.   -  person Machinarius    schedule 26.07.2014
comment
Рад, что вы нашли проблему   -  person Mohamed Taher Alrefaie    schedule 26.07.2014


Ответы (1)


Итак, новый файл JAR и изменения кода доступны в этом репозитории GITHUB. Также в репозитории есть демо для тестирования библиотеки.

Я изменил несколько строк в com.db4o.internal.Platform4. В основном я изменил порядок JDK для поиска.

Вы уверены, что это Далвик? Я не слышал о существенных изменениях в нем. Может быть, вы имеете в виду АРТ?

private static void createJdk() {


    Class<?>[] jdkFactories = {

            JDK_5.Factory.class,//1 switched both positions.
            DalvikVM.Factory.class,//2
            JDK_1_4.Factory.class,
            JDK_1_3.Factory.class,
            JDK_1_2.Factory.class,
            JDKReflect.Factory.class,
    };
    //-----
person Mohamed Taher Alrefaie    schedule 26.07.2014
comment
Только что протестировано на Nexus 4 с Kitkat 4.4.2 и Samsung Galaxy S4 с Kitkat 4.4.4. Похоже, это исправлено. Спасибо! - person Machinarius; 28.07.2014
comment
как мы используем db4o в студии Android, добавив, что в gradle, пожалуйста? - person Ivan Nikolchov; 04.11.2014
comment
java.lang.UnsupportedOperationException: java.lang.ClassCastException: java.lang.Long нельзя преобразовать в java.lang.Integer в com.db4o.internal.DalvikVM$Dalvik3ObjectFactoryFactory.(DalvikVM.java:120) в com.db4o.internal .DalvikVM.factory(DalvikVM.java:75) на com.db4o.internal.DalvikVM.supportSkipConstructorCall(DalvikVM.java:55) на com.db4o.internal.Platform4.callConstructor(Platform4.java:463) на com.db4o. Reflect.core.ConstructorSupport.createConstructor(ConstructorSupport.java:21) в com.db4o.reflect.jdk.JdkClass.constructorSpec(JdkClass.java:176) в com.db4o.reflect.jdk.JdkClass.ensureCanBeInstantiated(JdkClass.java: 182) в com.db4o.reflect.generic.GenericClass.ensureCanBeInstantiated(GenericClass.java:282) в com.db4o.internal.ClassMetadata.createConstructor(ClassMetadata.java:684) в com.db4o.internal.ClassMetadata.initializeConstructor(ClassMetadata .java:648) в com.db4o.internal.ClassMetadata.initializeAspects(ClassMetadata.java:266) в com.db 4o.internal.ClassMetadata.checkChanges(ClassMetadata.java:494) на com.db4o.internal.ClassMetadataRepository.readClassMetadata(ClassMetadataRepository.java:465) на com.db4o.internal.ClassMetadataRepository.classMetadataForId(ClassMetadataRepository.java:259) на com .db4o.internal.ObjectContainerBase.classMetadataForID(ObjectContainerBase.java:1069) в com.db4o.internal.marshall.ObjectHeader.(ObjectHeader.java:39) в com.db4o.internal.marshall.ObjectHeader.(ObjectHeader.java:23) ) в com.db4o.internal.marshall.UnmarshallingContext.readObjectHeader(UnmarshallingContext.java:124) в com.db4o.internal.marshall.UnmarshallingContext.read(UnmarshallingContext.java:47) в com.db4o.internal.ObjectReference.read( ObjectReference.java:306) в com.db4o.internal.ObjectReference.read(ObjectReference.java:292) в com.db4o.internal.ObjectContainerBase.getByID2(ObjectContainerBase.java:886) в com.db4o.internal.ObjectContainerBase.getByID (ObjectContainerBase.java:857) по адресу com.db4o.internal.fileheader.FileHeaderVariablePart.readIdentity(FileHeaderVariablePart.java:44) в com.db4o.internal.fileheader.NewFileHeaderBase.readIdentity(NewFileHeaderBase.java:92) в com.db4o.internal.LocalObjectContainer.readThis(LocalObjectContainer. java:497) в com.db4o.internal.IoAdaptedObjectContainer.openImpl(IoAdaptedObjectContainer.java:71) в com.db4o.internal.ObjectContainerBase$1.run(ObjectContainerBase.java:140) в com.db4o.foundation. DynamicVariable.with(DynamicVariable.java:54) в com.db4o.foundation.Environments.runWith(Environments.java:28) в com.db4o.internal.ObjectContainerBase.withEnvironment(ObjectContainerBase.java:161) в com.db4o.internal .ObjectContainerBase.open(ObjectContainerBase.java:131) в com.db4o.internal.IoAdaptedObjectContainer.(IoAdaptedObjectContainer.java:35) в com.db4o.internal.ObjectContainerFactory.openObjectContainer(ObjectContainerFactory.java:18) в com.db4o.Db4oEmbedded .openFile(Db4oEmbedded.java:64) - person tamtoum1987; 11.01.2017