@Starvings

Как правильно заполнить ROOM из уже созданной БД?

У меня довольно большой БД и заполнять ROOM с нуля - плохая идея, решил заполнить из уже созданной БД, с точно такими же колонками, как и в той, что прописал для ROOM. Прочитал документацию: https://developer.android.com/training/data-storag...

Но результат нулевой - БД не отображается, такое ощущение, что ее просто нет.
Entity
@Entity(tableName = "Stages")
public class Stages {

    @PrimaryKey(autoGenerate = true)
    public int ID;
    public String DESC;
    
    @Override
    public String toString() {
        return DESC;
    }
}


Dao
@Dao
public interface StagesDAO {
   
    @Insert
    void insert (Stages stages);


    @Query("DELETE from stages WHERE id IN (:idList)")
    int deleteByIdList(List<Long> idList);

    @Query("SELECT * FROM stages WHERE id = :ids")
    Stages getById(long ids);
}


Database
@Database(entities = {Stages.class}, version = 2,  exportSchema = false)
public abstract class StagesDB extends RoomDatabase {
    private static StagesDB instance = null;
    private static final String DB_NAME = "stages.db";
    
    public static StagesDB getInstance(Application application){
        if (instance == null){
            instance = Room.databaseBuilder(
                    application,
                    StagesDB.class,
                    DB_NAME
                    )
                    .createFromAsset("databases/Stages.db")
                    .allowMainThreadQueries()
                    .build();
            }
                return instance;
    }

    public abstract StagesDAO stagesDAO();
}


MainActivity
Log.d("reaf", String.valueOf(stagesDB.stagesDAO().getById(1)));


В DataBase Inspector БД не определеляется (при создании с нуля из ROOM было все ок). При этом через DB Browser подключение к БД проходит успешно и содержимое доступно.

При попытке чтения записи (MainActivity) ловлю ошибку со ссылку на строку чтения (что логично) а так же на строку __db.assertNotSuspendingTransaction(); в StagesDAO_Impl.java:

@Override
  public Stages getById(final long ids) {
    final String _sql = "SELECT * FROM stages WHERE id = ?";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
    int _argIndex = 1;
    _statement.bindLong(_argIndex, ids);
    __db.assertNotSuspendingTransaction();
    final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
    try {
      final int _cursorIndexOfID = CursorUtil.getColumnIndexOrThrow(_cursor, "ID");
      final int _cursorIndexOfDESC = CursorUtil.getColumnIndexOrThrow(_cursor, "DESC");
      final Stages _result;
      if(_cursor.moveToFirst()) {
        _result = new Stages();
        _result.ID = _cursor.getInt(_cursorIndexOfID);
        if (_cursor.isNull(_cursorIndexOfDESC)) {
          _result.DESC = null;
        } else {
          _result.DESC = _cursor.getString(_cursorIndexOfDESC);
        }
      } else {
        _result = null;
      }
      return _result;
    } finally {
      _cursor.close();
      _statement.release();
    }
  }


Помогите, пожалуйста, разобраться и в чем я ошибся?
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы