java - 在不同的类上使用 db4o

标签 java android object db4o

我在特定的类中使用 db4o,并且我有这个(工作正常):

public class xxxxx{
public Db4oHelper db4oHelper = null;
    public void xxxx (Context ctx){
        dbHelper(context);
        //operations...
    }

但是现在我需要在不同的类中使用 db4o 我应该在所有类中编写方法 dbHelper(Context ctx) 吗?

我尝试使用该方法编写一个类,然后使用 object.dbHelper 调用该方法,但不起作用:(

public class Db4o {
Context context;       
public Db4oHelper db4oHelper = null;
public Db4o(Context ctx){
context=ctx;
}
public Db4oHelper dbHelper(Context ctx) {

                if (db4oHelper == null) {
                    db4oHelper = new Db4oHelper(ctx);
                    db4oHelper.db();
                }
                return db4oHelper;
            }
    }

我能做什么?

最佳答案

我将使用一个抽象类,它提供设置上下文和获取帮助器的方法。这样的类将是我需要该功能的所有其他类的父类(super class)。

例如:


public abstract class PersistenceObject {

    private Context context;
    private volatile Db4oHelper helper;

    public PersistenceObject() { }

    public PersistenceObject(Context context) {
        this.context = context;
    }

    public Context getContext() {
        this.getContext();
    }

    public final void setContext(Context context) {
        if (this.context != context) {
            if (this.context == null) {
                onContextSet(context);
            } else if(context == null) {
                onContextUnset(context);
            } else {
                // Should you allow the context to change? 
                // Maybe the object is dirty, if so what to do?
                onContextChanged(context, this.context);
            }
            this.context = context;
        }
    }

    // we can call initialize on objects that extends this class
    // this initializes the context and also call the overloaded
    // initialize method to allow the classes to provided what
    // need to be done after we setup the context
    public final void initialize(Context context) {
        this.setContext(context);
        this.initialize();
    }

    private void onContextSet(Context context) {
        // ...
    }

    private void onContextUnset(Context context) {
        // lets clean the helper when we set the context to null
        this.helper == null;
    }

    private void onContextChanged(Context newContext, Context oldContext) {
        // Lets assume we can change the context
        // Since we change the context lets set the helper to null, 
        // so in the next call we get a new helper with the right context
        this.helper == null;
    }

    protected final Db4oHelper getDb4oHelper() {
        Db4oHelper helper = this.helper;
        if (helper == null) {
            synchronized(this) {
                helper = this.helper;
                if (helper == null) {
                    helper = this.helper = new Db4oHelper(context);
                    helper.db();
                }
            }
        }
        return helper;
    }

    public void initialize() {
    }
}

使用抽象类相当简单,我们只需扩展即可完成。


public class Category extends PersistenceObject {
    private String name;
    public Category() {
    }
    ....
}

public class Product extends PersistenceObject {
    private Category category;

    public Product() {
    }

    // ...

    public void initialize() {
        Db4oHelper helper = getDb4oHelper();
        // use the helper to perform whatever operations it needs
    }
}

使用辅助对象的另一个示例。


public final class PersistenceObjectHelper {
    private PersistenceObjectHelper() { }

    public static void doOPERATION(PersistenceObject object) {
        context = object.getContext();
        if (context == null) {
            // either the object was not initialized or the context was set to null
            // which basically means that we dont have a way to create the helper,
            // lets fail
            throw new IllegalArgumentException("Unable to create the DB4O due to lack of context");
        }
        DB4oHelper helper = object.getDB4oHelper();
        // use the helper and the object to do whatever we need
    }
}

Category category = new Category();
PersistenceObjectHelper.doOPERATION(category); // fails due to lack of context

Category category = new Category();
category.initialize(context);
PersistenceObjectHelper.doOPERATION(category); // works!

Category category = new Category();
category.setContext(context);
PersistenceObjectHelper.doOPERATION(category); // works!

希望有帮助。

关于java - 在不同的类上使用 db4o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188491/

相关文章:

javascript - 如何从字符串变量访问对象属性

ios - Objective C在哪里存储对象,堆或堆栈

java - 执行hadoop代码时出现问题

java - TextView 在 AsyncTask 中给出 NullPointerException

java - 为微调器实现 onItemSelectedListener

android - SecurityException - 未知调用包名称 -Android 6.0.1

php - 如何创建 PHP 方法链接?

java - 使 listActivity 每行包含 2 个项目

java - 衬垫 RIPEMD 160

java - 如何在java中显示一个实例而不是显示三个实例?