0

複数のテーブル/クラスでORMliteフレームワークを使用すると問題が発生します。

次のようなOrmLiteSqliteOpenHelperを拡張するDatabaseHelper.classが1つあります(重要な部分)。

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つの異なるオブジェクト(Object1、Object2)をデータベースに保存する2つのクラス(Admin1、Admin2)を使用しています。ここに私がこれに使用したコードがあります。

アミン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);
}

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)では正常に機能します。しかし、object1をAdmin1に保存し、その後object2をAdmin2に保存するか、逆にしたい場合(順序は決定的ではありません)、「int ret = myDaoObject2.create(o2);」という行に次のエラーが表示されます。

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

コードでObject2o2を作成する際にエラーは発生しません。「intret=myDaoObject2.create(o2);」という行の前ではありません。エラーが発生します...なぜ「?」があるのか​​わかりません。値で。オブジェクトの1行前が正常に見えます。

誰かアイデアはありますか?

どうもありがとう!

アップデート

残念ながら、私は問題を解決できませんでした。

onPause()私は今、アクティビティのおよび/またはでOrmLiteSqliteOpenHelperを閉じようとしましたonStop()

myHelper.close();

それ以来、エラーが発生します。

「アクティビティを破棄できません-nullポインタ例外」

このエラーが理解できません。

誰かアイデアがありますか?

4

2 に答える 2

3

admin2 の初期化時に DB ファイルが完全に書き換えられていませんか? 2 つの異なる Helper インスタンスが本当に必要ですか? 2 つの異なる dao オブジェクトが必要な場合は、1 つの共有ヘルパーを使用し、新しい 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;
 }
于 2011-04-24T17:22:37.803 に答える
-1

2日前にこのエラーが発生し、今夜解決しました:)最初のオブジェクトを作成するときは、データベース操作を実行できますが、別のオブジェクトを作成し、追加または削除などの操作を実行する場合..データベース ヘルパーが 2 番目のオブジェクト (Table) を作成しないため、エラーが発生しました。まず、アプリケーションを開くときに、以下のようにオブジェクト (Table クラス) を作成する必要があります。

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