android - Android 4.4.+ 上的 db4o : storing an object fails because cannot cast long to integer

标签 android db4o

运行 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(object)

我收到错误,cannot cast java.lang.Long to java.lang.Integer 。此问题可能是由新 Android 操作系统版本的新 dalvik 实现引起的,但是是否有针对此错误的任何补丁或解决方法?

一个人正在介绍一个补丁here但无法访问。

错误的完整堆栈跟踪

java.lang.UnsupportedOperationException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer at com.db4o.internal.DalvikVM$Dalvik3ObjectFactoryFactory.(DalvikVM.java:120) at com.db4o.internal.DalvikVM.factory(DalvikVM.java:75) at com.db4o.internal.DalvikVM.supportSkipConstructorCall(DalvikVM.java:55) at com.db4o.internal.Platform4.callConstructor(Platform4.java:463) at com.db4o.reflect.core.ConstructorSupport.createConstructor(ConstructorSupport.java:21) at com.db4o.reflect.jdk.JdkClass.constructorSpec(JdkClass.java:176) at com.db4o.reflect.jdk.JdkClass.ensureCanBeInstantiated(JdkClass.java:182) at com.db4o.reflect.generic.GenericClass.ensureCanBeInstantiated(GenericClass.java:282) at com.db4o.internal.ClassMetadata.createConstructor(ClassMetadata.java:684) at com.db4o.internal.ClassMetadata.initializeConstructor(ClassMetadata.java:648) at com.db4o.internal.ClassMetadata.initializeAspects(ClassMetadata.java:266) at com.db4o.internal.ClassMetadata.checkChanges(ClassMetadata.java:494) at com.db4o.internal.ClassMetadataRepository.readClassMetadata(ClassMetadataRepository.java:465) at com.db4o.internal.ClassMetadataRepository.classMetadataForId(ClassMetadataRepository.java:259) at com.db4o.internal.ObjectContainerBase.classMetadataForID(ObjectContainerBase.java:1069) at com.db4o.internal.marshall.ObjectHeader.(ObjectHeader.java:39) at com.db4o.internal.marshall.ObjectHeader.(ObjectHeader.java:23) at com.db4o.internal.marshall.UnmarshallingContext.readObjectHeader(UnmarshallingContext.java:124) at com.db4o.internal.marshall.UnmarshallingContext.read(UnmarshallingContext.java:47) at com.db4o.internal.ObjectReference.read(ObjectReference.java:306) at com.db4o.internal.ObjectReference.read(ObjectReference.java:292) at com.db4o.internal.ObjectContainerBase.getByID2(ObjectContainerBase.java:886) at com.db4o.internal.ObjectContainerBase.getByID(ObjectContainerBase.java:857) at com.db4o.internal.fileheader.FileHeaderVariablePart.readIdentity(FileHeaderVariablePart.java:44) at com.db4o.internal.fileheader.NewFileHeaderBase.readIdentity(NewFileHeaderBase.java:92) at com.db4o.internal.LocalObjectContainer.readThis(LocalObjectContainer.java:497) at com.db4o.internal.IoAdaptedObjectContainer.openImpl(IoAdaptedObjectContainer.java:71) at com.db4o.internal.ObjectContainerBase$1.run(ObjectContainerBase.java:140) at com.db4o.foundation.DynamicVariable.with(DynamicVariable.java:54) at com.db4o.foundation.Environments.runWith(Environments.java:28) at com.db4o.internal.ObjectContainerBase.withEnvironment(ObjectContainerBase.java:161) at com.db4o.internal.ObjectContainerBase.open(ObjectContainerBase.java:131) at com.db4o.internal.IoAdaptedObjectContainer.(IoAdaptedObjectContainer.java:35) at com.db4o.internal.ObjectContainerFactory.openObjectContainer(ObjectContainerFactory.java:18) at com.db4o.Db4oEmbedded.openFile(Db4oEmbedded.java:64)

更新:

所以,跟踪错误后,发现 com.db4o.internal.DalvikVM 内部存在从 Long 到 Integer 的可怕转换。在8.0版本中

int _methodId; _methodId = (Integer) constructorIdMethod.invoke(null, Object.class);

我尝试通过将变量声明为 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 的代码中创建补丁来解决这个问题

现在,新的 JAR 文件和代码更改可在 this GITHUB repository 中找到。 。存储库上还有一个用于测试库的演示。

我更改了 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,
    };
    //-----

关于android - Android 4.4.+ 上的 db4o : storing an object fails because cannot cast long to integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24966062/

相关文章:

c# - 用子类的实例替换 db4o 存储对象

java - Db4o API 在 NetBeans 中看不到动态加载的类?

hibernate - Mysql 到 Mysql - 使用 db40/drs 进行 Hibernate 复制?

android - 从 Mac 切换到 PC 时出现 Eclipse '@Override' 问题

android - 一个一个播放视频 issue : Android SDK

java - 如何从 Java 中的对象 ArrayList 获取 ArrayList 值?

database - 来自关系数据库背景,我应该如何在 db4o(或任何对象数据库)中建模关系?

java - DB4O 递归删除,它实际上是如何工作的?

android - 使用哪个Android控件?

android - 更改解析客户端 key