通过将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"
。
我无法理解这个错误: - (
有人有想法吗?
答案 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);
....
....