Android: база данных SQLite, созданная с комнатой, не показывает таблиц при открытии с sqlte-браузером - PullRequest
0 голосов
/ 03 июля 2018

Я использую Room Persistence Library 1.1.0 . Я мог найти файл базы данных на /data/data/<package_name>/databases/ с помощью Android File Explorer в File Studio. Он содержит несколько таблиц, и я могу без проблем получать доступ к содержимому этих таблиц, используя room-DAO s. Однако при открытии с sqlite-browser, таблица не отображается.

В чем может быть причина? Можно ли решить проблему, не переключаясь обратно на старый SQLiteOpenHelper из комнаты?

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

База данных номеров Решение для экспорта и импорта

Я столкнулся с той же проблемой в одном из моих проектов, я потратил два дня на решение этой проблемы.

Решение

Не создавать несколько экземпляров для библиотеки комнат. Несколько экземпляров, создающих все проблемы.

MyApplication

class MyApplication: Application() 
{

companion object {
    lateinit var mInstanceDB: AppDatabase
}

override fun onCreate() {
    super.onCreate()
    mInstanceDB = AppDatabase.getInstance(this)
}
}

AppDatabase

fun getInstance(context: Context): AppDatabase 
{

if (sInstance == null) {

    sInstance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java, "database").allowMainThreadQueries().build() 

            return sInstance!!
}
}

Теперь используйте этот экземпляр в любом количестве действий или фрагментов, например

{
    var allcustomer = MyApplication.mInstanceDB.customerDao.getAll()
}

Для экспорта и импорта используйте эту библиотеку

implementation 'com.ajts.androidmads.sqliteimpex:library:1.0.0'

Github link

0 голосов
/ 10 июля 2018

Вы можете использовать прагму wal_checkpoint для запуска контрольной точки , которая переместит транзакции файла WAL обратно в базу данных.

        theRoomDb.query("pragma wal_checkpoint(full)", null)

или

        // the result
        // contains 1 row with 3 columns
        // busy, log, checkpointed
        Cursor cursor = theRoomDb.query("pragma wal_checkpoint(full)", null)

См. Заявления PRAGMA для получения более подробной информации о значениях и результатах параметра pragma.

Если WAL не включен, прагма ничего не делает. Кстати, я тестировал с Room 1.1.1, и режим WAL по умолчанию не использовался, мне пришлось его включить.

0 голосов
/ 13 июля 2018

Скопируйте все три файла из Device File Explorer в AndroidStudio в каталог вашего ПК и откройте файл db в Db Browser для SQLite (http://sqlitebrowser.org). Убедитесь, что все три файла находятся в одной папке.

0 голосов
/ 03 июля 2018

Решение

Чтобы открыть таких баз данных * с помощью sqlite-browser, , вам необходимо скопировать все три файла . Все должны быть в одном каталоге.

* Базы данных хранятся в нескольких файлах, как указано в вопросе.


Почему три файла?

Согласно документации, начиная с версии 1.1.0, Room использует write-ahead logging в качестве режима журнала по умолчанию для устройств с достаточным объемом оперативной памяти и работающих на уровне API 16 или выше. Это было Truncate для всех устройств до этой версии. write-ahead logging имеет другую внутреннюю структуру по сравнению с Truncate.


Посмотрите на временные файлы, используемые SQLite время от времени:

До версии 1.1.0

enter image description here

Начиная с версии 1.1.0

enter image description here

* *
тысяча сорок-девять

Если вы хотите явно изменить режим журнала на Truncate, вы можете сделать это следующим образом. Но не рекомендуется , потому что WAL намного лучше по сравнению с Truncate.

public static void initialize(Context context) {
    sAppDatabase = Room.databaseBuilder(
            context,
            AppDatabase.class,
            DATABASE_NAME)
        .setJournalMode(JournalMode.TRUNCATE).build();
}


Можно ли переместить его в один файл без изменения на Truncate?

Да, это так. Запросите следующий оператор для базы данных.

pragma wal_checkpoint(full)

Это подробно обсуждается здесь здесь .

...