【问题标题】:ObjectBox - Another BoxStore is still open for this directoryObjectBox - 另一个 BoxStore 仍然为此目录打开
【发布时间】:2018-01-24 12:41:35
【问题描述】:

所以我将 ObjectBox 与一个名为 LibGDX 的库一起使用,这是一个用 java 编写的跨平台游戏库。它通过在单个 Android Activity 类中加载类似于 Java 小程序的内容来工作,但所有工作都在小程序中完成,而在 Android 中没有任何工作(除了实例化 Activity)。

因此,我的 objectBox 代码是 Java 代码,不能使用上下文。因此我跑了

boxStore = MyObjectBox.builder().androidContext(this).build();

每次在应用启动时创建数据库对象时,我都会运行以下代码。

private void createMyObjectBox() throws IOException {
    FileHandle fileHandle = Gdx.files.local("objectstorefile");
    if(!fileHandle.isDirectory()) {
        fileHandle.mkdirs();
    }
    store = MyObjectBox.builder().directory(boxStoreDir).build();
}

如果我启动我的应用程序,然后立即点击主页按钮,然后再次启动它,我遇到了这个崩溃。我认为有一个残留的 MyObjectBox 对象仍然存在,可能是由于 Android 和静态对象等的性质,没有被完全处理掉。

我不确定如何对此进行测试以避免错误。

【问题讨论】:

    标签: objectbox


    【解决方案1】:

    在任何时候,每个目录都应该只有一个 MyObjectBox 实例。因此,您应该关闭旧商店 (store.close()),或者只保持商店打开(例如单例、静态等)。后者通常是首选,因为它更简单、更高效。

    更新:非 Android 代码示例

    static BoxStore store;
    public static BoxStore getStore() {
        if(store == null) store = createMyObjectBox();
        return store;
    }
    

    【讨论】:

    • 感谢您的快速回复。我正在努力弄清楚如何让它保持活力。我查看了 verifyNotAlreadyOpen() 的代码,这就是问题所在。如果我打开我的应用程序,立即点击主页按钮然后再次打开它,仍然有一个旧版本,即 System.gc(); 的 4 行; System.runFinalization(); System.gc(); System.runFinalization();似乎无法冲走。有什么想法吗?
    • 每次我的应用关闭时我都应该关闭商店吗?
    • 我在目录上运行了一个快速列表命令,两次(应用程序运行或应用程序崩溃)我在目录中都有相同的两个文件。 lock.mdb 和 data.mdb
    • 刚刚更新了一个简单的单例示例。这有帮助吗?
    • 是的!嗯,我想是的。我打了几次回家,启动应用程序,家庭启动应用程序,它似乎修复了它....除了它确实崩溃了一次。但是 Android Studio 没有给我堆栈跟踪!所以这可能是完全无关的。但我认为它现在已修复,或者至少从边缘情况变为超级边缘情况:) 再次感谢,感谢超级快速的响应
    【解决方案2】:

    在 Kotlin 中,您可以像这样制作“自制”单例。这应该可以解决您的问题:

    companion object{
        var times:Boolean = false
    }
    
    object ObjectBox {
        lateinit var boxStore: BoxStore
            private set
    
           
            fun init(context: Context) {
                if(!times) {
                    boxStore = MyObjectBox.builder()
                        .androidContext(context.applicationContext)
                        .build()
                    times = true
                }
            }
        }
    

    【讨论】:

      【解决方案3】:

      你可以用这种方式

      public class ObjectBox {
          private static  BoxStore boxStore;
      
          public static  void init(Context context) {
      
              if (boxStore==null)
              boxStore = MyObjectBox.builder().androidContext(context.getApplicationContext()).build();
      
      
          }
      
          public static BoxStore get() {
              return boxStore;
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        相关资源
        最近更新 更多