База данных скопирована в локальную файловую систему и Room Query не будет работать - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь запросить данные в библиотеке постоянства Android Room из существующей базы данных.Нет ошибки компиляции или ошибки во время выполнения.У курсора просто нет результата.

Запрос проверен и выглядит нормально (также в сгенерированном Java, как упомянуто в ответе 'Pinakin' База данных комнаты Android DAO, журнал отладки

База данных существует в папке /data/data/com.project/databases/. База данных имеет правильный размер, но нет других файлов, таких как упомянутые в ответе 'kosas' Комната AndroidФайл базы данных пуст

Подобный стиль копирования, как показано здесь https://android.jlelse.eu/room-persistence-library-with-pre-populated-database-5f17ef103d3d. Я изменил конструктор только на:

grammarDatabase = GrammarDatabase.getInstance(appContext);

, потому что моя база данных GrammarDatabase выглядит следующим образом:

@Database(
        entities = {
                Term.class
        }, version = 1, exportSchema = false
)
public abstract class GrammarDatabase extends RoomDatabase {

    private static final String DB_NAME = "database.db";
    private static volatile GrammarDatabase instance;

    public static synchronized GrammarDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }

        return instance;
    }

    private static GrammarDatabase create(final Context context) {
        return Room.databaseBuilder(context, GrammarDatabase.class, DB_NAME).fallbackToDestructiveMigration().allowMainThreadQueries().build();
    }

    public abstract TermDao getTermDao();

}

.fallbackToDestructiveMigration() и .allowMainThreadQueries только для целей тестирования.

Интерфейс 'TermDao_Impl' (сокращенная строка запроса):

@Override
  public Cursor getSearchContent(String searchTerm, String languageCode) {
    final String _sql = "SELECT T._id, T.term FROM term AS T INNER JOIN ... INNER JOIN language AS L INNER JOIN ... AND L.code= ? AND T.term LIKE ?";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 2);
    int _argIndex = 1;
    if (languageCode == null) {
      _statement.bindNull(_argIndex);
    } else {
      _statement.bindString(_argIndex, languageCode);
    }
    _argIndex = 2;
    if (searchTerm == null) {
      _statement.bindNull(_argIndex);
    } else {
      _statement.bindString(_argIndex, searchTerm);
    }
    final Cursor _tmpResult = __db.query(_statement);
    return _tmpResult;
  }

ВызовMainActivity:

Сначала: database = DatabaseHelper.getInstance(context).getGrammarDatabase();

Затем:

Cursor c = database.getTermDao().getSearchContent("'"+searchTerm+"'", "'"+currentLanguageCode+"'");
if (c.moveToNext()) {
    System.out.println("Found!");
    System.out.println(c.getString(c.getColumnIndex("T.term")));
}

Попытка вызова с «» вокруг аргументов и без.

Таккурсор пуст, даже если запрос будет иметь результат (проверено в DB Browserдля SQLite)."Найденный!"Не печатается.

...