Android ORMlite - более одной таблицы / классов - PullRequest
0 голосов
/ 24 апреля 2011

У меня проблема с использованием инфраструктуры 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).Но если я сохраняю 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);"ошибка возникает ... я понятия не имею, почему есть "?"в стоимости.Одна строка показывает, что объект выглядит отлично.

У кого-нибудь есть идеи?

Большое спасибо!

Обновление

К сожалению, яне удалось решить проблему.

Я пытался закрыть OrmLiteSqliteOpenHelper в onPause() и / или в onStop() активности:

myHelper.close();

С тех поря получаю ошибку "Unable to destroy activity - null pointer exception".

Я не могу понять эту ошибку: - (

У кого-нибудь есть идея?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Разве ваш файл БД не полностью переписан при инициализации 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;
 }
0 голосов
/ 18 августа 2012

Я получил эту ошибку 2 дня назад, и я только что решил эту ночь :) Когда вы создаете свой первый объект, вы можете выполнять любые операции с базой данных, но когда вы хотите создать другой объект и выполнять некоторые операции, такие как добавление, удаление или т. Д..вы получаете ошибку, потому что Помощник по базам данных не создает второй объект (TAble). Во-первых, когда вы открываете свое приложение, вы должны создавать свои объекты (классы TAble), как показано ниже

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