Таблица базы данных комнаты все еще пуста после вставки новых данных - PullRequest
0 голосов
/ 26 октября 2018

Я только что закончил следующий урок для моего приложения: https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#4

Но моя проблема в том, что даже после того, как я вставил данные, моя база данных все еще пуста. Я проверил это, просмотрев в браузере базы данных, и в нем нет записей. Любая помощь будет высоко оценен. Если вам нужна дополнительная информация. дайте мне знать.

Класс объекта Dao:

 @Insert(onConflict = OnConflictStrategy.REPLACE)
void insertRecord(LocationDetails Details);

мой класс сущности:

Entity(tableName = "location")

открытый класс LocationDetails {

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@PrimaryKey(autoGenerate = true)
private int id;
private String jsonObjectString;
private double latitude;
private double longitude;
private String locationType;

public String getLocationType() {
    return locationType;
}

public void setLocationType(String locationType) {
    this.locationType = locationType;
}

public double getLatitude() {
    return latitude;
}

public void setLatitude(double latitude) {
    this.latitude = latitude;
}

public double getLongitude() {
    return longitude;
}

public void setLongitude(double longitude) {
    this.longitude = longitude;
}

public String getJsonObjectString() {
    return jsonObjectString;
}

public void setJsonObjectString(String jsonObjectString) {
    this.jsonObjectString = jsonObjectString;
}

public String toString() {
    return "Lat: " + latitude + ", Long: " + longitude;
}

}

Это мой класс контроллера базы данных, который мои ViewModels используют для взаимодействия с БД.

открытый класс DatabaseController {

private String TAG = getClass().getSimpleName();

private static DatabaseController sInstance;
private LiveData<List<LocationDetails>> mListOfLocations;
private Database mDatabase;

private DatabaseController(Context context) {
    mDatabase = Database.getDatabase(context);
}

public static DatabaseController getInstance() {
    return sInstance;
}

public static void initInstance(Context context) {
    sInstance = new DatabaseController(context);
}

public void addLocationRecord(LocationDetails locationDetails) {
    new insertAsyncTask(mDatabase).execute(locationDetails);
    Log.d(TAG, "Location Record Added Successfully");
}

private static class insertAsyncTask extends AsyncTask<LocationDetails, Void, Void> {

    private Database database;

    insertAsyncTask(Database database) {
        this.database = database;
    }

    @Override
    protected Void doInBackground(LocationDetails... databases) {
        database.mMyDao().insertRecord(databases[0]);
        return null;
    }
}

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

И ответ на этот вопрос тот же, но его решение было другим, поэтому не дубликат. Таблица базы данных комнаты все еще пуста после вставки данных

Я получаю эти журналы в первый раз:

2018-10-26 18:18:41.329 27827-27827/genesis.com.getlocation D/DatabaseController: Location Record Added Successfully
2018-10-26 18:18:41.345 27827-27876/genesis.com.getlocation D/Surface: Surface::disconnect(this=0x990a1f00,api=1)
2018-10-26 18:18:41.346 27827-27944/genesis.com.getlocation W/SQLiteConnection: Could not change the database journal as DB was busy. Proceeding...
2018-10-26 18:18:41.347 27827-27876/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xaaf92040) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:41.347 27827-27876/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xaaf92400) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:41.347 27827-27876/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xaaf924c0) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:41.347 27827-27876/genesis.com.getlocation D/Surface: Surface::disconnect(this=0x990a1f00,api=1)
2018-10-26 18:18:41.362 27827-27944/genesis.com.getlocation W/SQLiteConnection: Could not change the database journal as DB was busy. Proceeding...
2018-10-26 18:18:41.369 27827-27944/genesis.com.getlocation D/SQLiteDatabase: beginTransaction()
2018-10-26 18:18:41.372 27827-27944/genesis.com.getlocation D/SQLiteDatabase: endTransaction()
2018-10-26 18:18:41.374 27827-27827/genesis.com.getlocation D/WindowClient: Remove from mViews: DecorView@74e9112[], this = android.view.WindowManagerGlobal@fbcfdce
2018-10-26 18:18:41.377 27827-27827/genesis.com.getlocation V/InputMethodManager: onWindowFocus: null softInputMode=32 first=false flags=#81810100
2018-10-26 18:18:41.380 27827-27944/genesis.com.getlocation D/SQLiteDatabase: beginTransaction()
2018-10-26 18:18:41.384 27827-27944/genesis.com.getlocation D/SQLiteDatabase: endTransaction()
2018-10-26 18:18:41.394 27827-27873/genesis.com.getlocation I/BufferQueueProducer: [SurfaceTexture-0-27827-0](this:0xa8461000,id:0,api:1,p:27827,c:27827) queueBuffer: fps=0.67 dur=4486.29 max=3892.05 min=17.56
2018-10-26 18:18:41.403 27827-27945/genesis.com.getlocation D/SQLiteDatabase: beginTransaction()
2018-10-26 18:18:41.405 27827-27945/genesis.com.getlocation D/SQLiteDatabase: endTransaction()

После этого я всегда получаю эти журналы: (разница в том, что база данных занята)

 2018-10-26 18:18:08.788 27080-27080/genesis.com.getlocation D/ConfirmDialogFragment: onDialogButtonClicked
2018-10-26 18:18:08.788 27080-27080/genesis.com.getlocation D/ConfirmDialogFragmentViewModel: RadioButton value is Desimus
2018-10-26 18:18:08.788 27080-27080/genesis.com.getlocation D/ConfirmDialogFragmentViewModel: Name of place is  Khan Plaza
2018-10-26 18:18:08.789 27080-27080/genesis.com.getlocation D/DatabaseController: Location Record Added Successfully
2018-10-26 18:18:08.791 27080-27775/genesis.com.getlocation D/SQLiteDatabase: beginTransaction()
2018-10-26 18:18:08.805 27080-27775/genesis.com.getlocation D/SQLiteDatabase: endTransaction()
2018-10-26 18:18:08.824 27080-27166/genesis.com.getlocation D/Surface: Surface::disconnect(this=0x94b83e00,api=1)
2018-10-26 18:18:08.825 27080-27166/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xa6043c40) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:08.826 27080-27166/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xa60425c0) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:08.826 27080-27166/genesis.com.getlocation D/GraphicBuffer: unregister, handle(0xa6042680) (w:848 h:1264 s:848 f:0x1 u:0x000b00)
2018-10-26 18:18:08.826 27080-27166/genesis.com.getlocation D/Surface: Surface::disconnect(this=0x94b83e00,api=1)
2018-10-26 18:18:08.829 27080-27602/genesis.com.getlocation D/SQLiteDatabase: beginTransaction()
2018-10-26 18:18:08.831 27080-27602/genesis.com.getlocation D/SQLiteDatabase: endTransaction()
2018-10-26 18:18:08.859 27080-27080/genesis.com.getlocation D/WindowClient: Remove from mViews: DecorView@3ad944e[], this = android.view.WindowManagerGlobal@40be950
2018-10-26 18:18:08.867 27080-27080/genesis.com.getlocation V/InputMethodManager: onWindowFocus: null softInputMode=32 first=false flags=#81810100
2018-10-26 18:18:08.879 27080-27235/genesis.com.getlocation I/BufferQueueProducer: [SurfaceTexture-0-27080-1](this:0xa8460000,id:1,api:1,p:27080,c:27080) queueBuffer: fps=0.44 dur=4554.45 max=4532.60 min=21.85
2018-10-26 18:18:08.893 27080-27235/genesis.com.getlocation I/BufferQueueProducer: [SurfaceTexture-0-27080-1](this:0xa8460000,id:1,api:1,p:27080,c:27080) queueBuffer: slot 0 is dropped, handle=0xaaf91800

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Убедитесь, что ваш класс LocationDetails реализует Serializable.В своем классе, расширяющем RoomDatabase, вставьте класс, который вы хотите добавить таким образом

 @Database(entities = {
        LocationDetails.class,
     },version = 1, exportSchema = false)

, и обязательно обновляйте номер версии каждый раз, когда вы добавляете / удаляете класс в вашей базе данных.Кроме того, я бы порекомендовал использовать версию комнаты 1.1.1-rc1, которая более стабильна, чем 1.1.1, добавив эту строку в ваш gradle

 implementation 'android.arch.persistence.room:runtime:1.1.1-rc1'

Также я бы порекомендовал вызвать ваш запрос вПоток, на Android 6+ (может быть, семь не вспомнить), каждый AsyncTask устройств совместно использует один и тот же поток и ждет очереди, чтобы выполнить функцию DoInBackground, и иногда запуск вашей задачи может занять до 5-10 секунд.

0 голосов
/ 26 октября 2018

Скорее всего, вы не получаете успешную вставку.

Убедитесь, что вы возвращаете основной идентификатор при вставке. Убедитесь, что вы выполняете вставку в фоновом потоке.Убедитесь, что вы выполняете извлечение в фоновом потоке

Также, если вы внесли изменения в модель после установки, это приведет к сбою при прикосновении к БД, поскольку схема больше не соответствует переменным модели.

Итак, проверьте вашу базу данных, создайте строку кода и убедитесь, что у вас есть дескриптор для изменений схемы, таких как изменение вашей модели.Деструктивный откат - это нормально, либо удалите его и установите, если его еще никто не использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...