4

所以我将 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 和静态对象等的性质,没有被完全处理掉。

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

4

3 回答 3

3

在任何时候,每个目录都应该只有一个 MyObjectBox 实例。因此,您应该关闭旧存储store.close()(后者通常是首选,因为它更简单、更有效。

更新:非 Android 代码示例

static BoxStore store;
public static BoxStore getStore() {
    if(store == null) store = createMyObjectBox();
    return store;
}
于 2018-01-24T13:41:18.730 回答
1

在 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
            }
        }
    }
于 2021-04-22T20:24:23.397 回答
0

你可以使用这种方式

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;
    }
于 2020-03-16T17:42:06.590 回答