0

我在使用带有多个表/类的 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)。这是我用于此的代码。

胺1:

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);
}

管理员2:

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 中)。但是,如果我将 object1 保存在 Admin1 中,然后我想将 object2 保存在 Admin2 中或反转(顺序不是决定性的),我会在“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()我现在尝试在活动的和/或活动中关闭 OrmLiteSqliteOpenHelper onStop()

myHelper.close();

从那以后我得到错误:

“无法销毁活动 - 空指针异常”

我无法理解这个错误。

有人有想法吗?

4

2 回答 2

3

您的数据库文件不是在 admin2 初始化时完全重写的吗?你真的需要两个不同的 Helper 实例吗?如果您只需要为它们提供两个不同的 dao 对象 - 使用一个共享帮助器并添加一个新的 getAdmin2Dao 方法。

高温高压

编辑(添加一些代码):

 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;
 }
于 2011-04-24T17:22:37.803 回答
-1

两天前我收到了这个错误,今天晚上我刚刚解决了:)当你创建你的第一个对象时,你可以做任何数据库操作,但是当你想创建另一个对象并做一些诸如添加或删除等操作时......你会得到一个错误,因为数据库助手不创建第二个对象(表)。首先,当你打开你的应用程序时,你必须创建你的对象(表类),如下所示

TableUtils.createTable(helper.getConnectionSource(), BudgetCategory.class);
....
....
于 2012-08-18T18:33:11.817 回答