Как использовать базу данных для слияния после загрузки? - PullRequest
0 голосов
/ 17 мая 2018

Я использую Ormlite для своего приложения для Android, чтобы хранить свои данные. Я хочу загрузить базу данных с сайта, и после этого программа проверяет, существует ли база данных. Если база данных существует, то новая база данных и старая база данных должны объединиться. Вот и моя проблема. В Ormlite вы создаете Dao для взаимодействия с таблицами базы данных, и я хотел знать, как я могу взаимодействовать с новой базой данных после загрузки?

Например: База данных А из приложения содержит элементы:

Сыр, Яйца, Молоко, Курица

База данных B из загрузки содержит элементы:

Сыр, яйца, молоко, мука, хлеб

В конце хочу:

Сыр, яйца, молоко, мука, хлеб, курица и осталась только одна база данных.

И для уточнения: да, существуют вопросы "Как объединить базы данных".
Например: Обновление Android - объединить содержимое базы данных?
Но это не моя проблема. Я хочу знать, как взаимодействовать с новой базой данных с помощью Ormlite. Какой способ существует, чтобы я мог получить доступ к новой базе данных?

Edit:
Я пытался загрузить базу данных и гарантировать, что версия всегда выше, чем старая версия базы данных. Поэтому, по крайней мере, то, что я думал, это будет идти в методе OnUpgrade и там я мог бы объединить базу данных. Но я только заменил старую базу данных.
Я также попытался создать второй OrmDBHelper с другим именем, поэтому после загрузки я мог использовать там методы. Но никаких ошибок или чего-либо еще.
Вот вспомогательный элемент базы данных из существующей базы данных, второй - тот же, за исключением имени.

public class OrmDbHelper extends OrmLiteSqliteOpenHelper {

public static final String LOG = OrmDbHelper.class.getName();
public static final String DB_NAME = "bestand.db";
public static final int DB_VERSION = 1;

public OrmDbHelper(Context context) {
    super(context, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()
            + File.separator + DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
    try {
        TableUtils.createTableIfNotExists(connectionSource, ScanItem.class);
        TableUtils.createTableIfNotExists(connectionSource, BestandItem.class);
        TableUtils.createTableIfNotExists(connectionSource, SettingsItem.class);
    } catch (SQLException ex) {
        Log.e(LOG, "Error Creating table", ex);
    }
}

@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    try {
        TableUtils.dropTable(connectionSource, ScanItem.class, true);
        TableUtils.dropTable(connectionSource, BestandItem.class, true);
        TableUtils.dropTable(connectionSource, SettingsItem.class, true);
        TableUtils.createTable(connectionSource, ScanItem.class);
        TableUtils.createTable(connectionSource, BestandItem.class);
        TableUtils.createTable(connectionSource, SettingsItem.class);
    } catch (SQLException ex) {
        Log.e(LOG, "Error Updating table", ex);
    }
}

public Dao<ScanItem, Integer> createScanItemDAO() {
    try {
        return DaoManager.createDao(connectionSource, ScanItem.class);
    } catch (SQLException ex) {
        Log.e(LOG, "Error Creating DAO for Todo class", ex);
    }
    return null;
}

public Dao<BestandItem, Integer> createBestandItemDAO() {
    try {
        return DaoManager.createDao(connectionSource, BestandItem.class);
    } catch (SQLException ex) {
        Log.e(LOG, "Error Creating DAO for Todo class", ex);
    }
    return null;
}

public Dao<SettingsItem, Integer> createSettingItemDAO() {
    try {
        return DaoManager.createDao(connectionSource, SettingsItem.class);
    } catch (SQLException ex) {
        Log.e(LOG, "Error Creating DAO for Todo class", ex);
    }
    return null;
}
}

А вот как я пытался получить доступ ко второй базе данных: Доступ к первой базе данных работает, а ко второй - нет. Я даже проверил, работает ли загрузка второй базы данных.

public class OrmDataHelper {

private Dao<ScanItem, Integer> scanItemDAO;
private Dao<BestandItem, Integer> bestandItemDAO;
private Dao<SettingsItem, Integer> settingsItemsDAO;

public OrmDataHelper(Context context) {
    OrmDbHelper ormDbHelper = new OrmDbHelper(context);
     scanItemDAO = ormDbHelper.createScanItemDAO();
     bestandItemDAO = ormDbHelper.createBestandItemDAO();
     settingsItemsDAO = ormDbHelper.createSettingItemDAO();
}

public ArrayList<ScanItem> getAllScanItem() {
    ArrayList<ScanItem> temp = null;
    try {
         temp = new ArrayList<>(scanItemDAO.queryForAll());
    } catch (SQLException ex) {
        ex.getMessage();
    }
    return temp;
}
...