2014-07-25 25 views
2

在運行db4o的庫(兩者8.1的快照和8.0),打開數據庫工作db4o的Android電子4.4 +:存儲一個對象失敗,因爲不能投射長整數

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。這個問題可能是由新的Android操作系統版本的新dalvik實現引起的,但是有沒有針對此錯誤的補丁或解決方法?

一個傢伙引入了一個補丁here,但它無法訪問。

錯誤的完整堆棧跟蹤

java.lang.UnsupportedOperationException:java.lang.ClassCastException:java.lang.Long中不能轉換爲java.lang.Integer中 在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) 在com.db4o.internal.ClassMetadata.createConstructor(ClassMetadata.java:684) 在com.db4o.internal.ClassMetadata.initializeConstructor(ClassMetadata.java:648) 在COM。在com.db4o.internal.ClassMetadata.checkChanges(ClassMetadata.java:494) at com.db4o.internal.ClassMetadataRepository.readClassMetadata(ClassMetadataRepository.java:465)db4o.internal.ClassMetadata.initializeAspects(ClassMetadata.java:266) 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) 在com.db4o.internal.ObjectReference.read(ObjectReference.java:292) 在com.db4o.internal.ObjectContainerBase.getByID2(ObjectContainerBase.java:886) at 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) 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。 withInvironment(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) 在com.db4o.Db4oEmbedded.openFile(Db4oEmbedded.java:64)

更新:

因此,跟蹤誤差後,事實證明,有從龍一個可怕的投在裏面的版本com.db4o.internal.DalvikVM整型8.0

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

我試圖通過聲明變量來解決這個問題。我重新編譯和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); 
     } 
    } 

任何線索如何解決此問題?

+0

你確定這是Dalvik嗎?我沒有聽說過它的重大變化。也許你是指ART? – Machinarius

+0

@Machinarius,看看堆棧跟蹤?當然是達爾維克。 –

+0

我不會認爲這是在Dalvik上運行的電話。檢查開發設置。 – Machinarius

回答

3

我設法通過創建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, 
    }; 
    //----- 
+1

很高興你發現問題 – Machinarius

+0

謝謝@Machinarius –

+1

剛剛在運行Kitkat 4.4.2的Nexus 4和運行Kitkat 4.4.4的Samsung Galaxy S4上進行了測試。看起來像它的固定。謝謝! –

相關問題