Android ORMlite - 多个表/类

时间:2011-04-24 16:33:02

标签: android ormlite

通过将ORMlite框架与多个表/类一起使用,我遇到了问题。

我有一个DatabaseHelper.class扩展了OrmLiteSqliteOpenHelper,它看起来像这样(重要部分):

public class DatabaseHelper<T> extends OrmLiteSqliteOpenHelper {

    private static final String DATABASE_NAME = "database.db";
    private static final int DATABASE_VERSION = 6;

    private Dao<T, Integer> myDao = null;
    private Class<T> type;

    public DatabaseHelper(Context context, Class<T> type) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.type = type;
    }

    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        try {
            TableUtils.createTable(connectionSource, type);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Dao<T, Integer> getmyDataDao() throws SQLException {
        if (myDao == null) {
            myDao = getDao(type);
        }
        return myDao;
    }
}

我使用2个类(Admin1,Admin2),其中我想在数据库中保存2个不同的对象(Object1,Object2)。这里是我用于此的代码。

Amin1:

static {
    OpenHelperManager.setOpenHelperFactory(new SqliteOpenHelperFactory() {
        public OrmLiteSqliteOpenHelper getHelper(Context context) {
            return new DatabaseHelper<Object1>(context, Object1.class);
        }
    });
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.object1);
    Dao<Object1, Integer> myDaoObject1 = getHelper().getmyDataDao();
    Object1 o1 = new Object1("Name of Object 1");
    int ret = myDaoObject1.create(o1);
}

Admin2的:

static {
    OpenHelperManager.setOpenHelperFactory(new SqliteOpenHelperFactory() {
        public OrmLiteSqliteOpenHelper getHelper(Context context) {
            return new DatabaseHelper<Object2>(context, Object2.class);
        }
    });
}


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.object2);
    Dao<Object2, Integer> myDaoObject2 = getHelper().getmyDataDao();
    Object2 o2 = new Object2("Name of Object 2");
    int ret = myDaoObject2.create(o2);
}

它适用于我保存的第一个对象(在Admin1或Admin2中)。但是,如果我在Admin1中保存object1,之后我想在Admin2中保存object2或反向(顺序不是决定性的),我在行“int ret = myDaoObject2.create(o2);”中得到以下错误:

Unable to run stmt on object com.example.Object2@44c408f0: INSERT INTO `object2` (`name` ) VALUES (?)

在代码中创建Object2 o2没有错误。不要行“int ret = myDaoObject2.create(o2);”发生错误......我不知道为什么会出现“?”在价值中。一条线在该物体看起来很好。

有人有想法吗?

非常感谢!

更新

不幸的是我无法解决问题。

我现在尝试在活动的onPause()和/或onStop()关闭OrmLiteSqliteOpenHelper:

myHelper.close();

从那时起我收到错误"Unable to destroy activity - null pointer exception"

我无法理解这个错误: - (

有人有想法吗?

2 个答案:

答案 0 :(得分:3)

在admin2初始化时,您的DB文件是否完全重写? 你真的需要两个不同的Helper实例吗?如果你只需要有两个不同的dao对象 - 使用一个共享助手,只需添加一个新的getAdmin2Dao方法。

HTH

编辑(添加一些代码):

 private Dao<Profile, String> profileDao = null;
 private Dao<Network, String> networkDao = null;

 @Override
 public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
            try {
                    Log.i(DBHelper.class.getName(), "onCreate");

                    TableUtils.createTable(connectionSource, Network.class);
                    TableUtils.createTable(connectionSource, Profile.class);

            } catch (SQLException e) {
                    Log.e(DBHelper.class.getName(), "Can't create database", e);
                    throw new RuntimeException(e);
            }
 }

 public Dao<Profile, String> getProfileDao() throws SQLException {
    if (profileDao == null) {
       profileDao = getDao(Profile.class);
    }
    return profileDao;
 }

 // ... Same for the other DAO

 @Override
 public void close() {
    super.close();

    networkDao = null;
    profileDao = null;
 }

答案 1 :(得分:-1)

我2天前收到此错误,我刚刚解决了这个问题:)当您创建第一个对象时,您可以执行任何数据库操作,但是当您想要创建另一个对象并执行某些操作(如添加或删除等)时。 。你得到一个错误,因为数据库帮助器不创建第二个对象(TAble)。首先,当你打开你的应用程序时,你必须创建你的对象(TAble类),如下所示

TableUtils.createTable(helper.getConnectionSource(), BudgetCategory.class);
....
....