Объект не вставлен в базу данных Room - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть приложение для Android, которое использует Room Database.У меня есть несколько таблиц, и все они отлично работают, кроме одной - объекта User (таблица).Я использую один и тот же подход для всех объектов (таблиц), но все же данные не вставляются в этот точный.Стол еще пуст.Хотя другие таблицы заполнены просто отлично.Ниже приведен мой код.

Во фрагменте, если пользователь нажимает кнопку, вызывается метод fabClickHandler.Метод проверяет, есть ли уже созданный пользователь в БД.Если это так, он возвращает свой ключ API и использует его для запроса.Если его нет, он запрашивает ввод API-ключа.Затем он должен сохранить его в БД, но это не так.В следующий раз он запрашивает снова, и я проверил таблицу, и она действительно пуста.

Если вручную заполнить таблицу объектом User, все работает просто отлично.

User.java:

@Entity
public class User {

    @PrimaryKey
    private int uid;
    private String name;
    private String apikey;

    public User(int uid, String name, String apikey) {
        this.uid = uid;
        this.name = name;
        this.apikey = apikey;
    }

    @Ignore
    public User(String name, String apikey) {
        this.name = name;
        this.apikey = apikey;
    }

    @Ignore
    public User() {
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getApikey() {
        return apikey;
    }

    public void setApikey(String apikey) {
        this.apikey = apikey;
    }
}

UserDao.java:

@Dao
public interface UserDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertUser(User user);

Фрагмент:

public void fabClickHandler() {
        database = AppDatabase.getInstance(activity.getApplicationContext());
        userDao = database.userDao();
        String keyFromDB = "NOTHING_FETCHED";
        try {
            keyFromDB = checkDBForUserAPIKey()[0];
            Log.d(DEBUG_TAG_INFO, "First keyFromDB: " + keyFromDB);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (!keyFromDB.equals("GOT_NULL") && !keyFromDB.equals("NOTHING_FETCHED") && !keyFromDB.equals("NOTHING_FOUND")) {
            Log.d(DEBUG_TAG_INFO, "Second keyFromDB: " + keyFromDB);
            resourcesController.getFactoriesList(keyFromDB, factoriesAdapter);
        } else {
            pricesController.getMarketPricesAvgsList(pricesAdapter);
            final EditText input = new EditText(activity);
            final String[] user_apikey = {"NONE_ENTERED"};
            AlertDialog.Builder builder = new AlertDialog.Builder(activity);
            builder.setMessage(R.string.dialog_apikey_enter_message).setTitle(R.string.dialog_apikey_enter_title).setView(input);
            builder.setPositiveButton(R.string.dialog_apikey_enter_positive_button, (dialog, which) -> {
                user_apikey[0] = input.getText().toString();
                Log.d(DEBUG_TAG_INFO, "Third keyFromDB: " + user_apikey[0]);
                new Thread(() -> {
                    userDao.insertUser(new User(1, "Main", user_apikey[0]));
                });
                Toast.makeText(activity, "Syncing...", Toast.LENGTH_SHORT).show();
                resourcesController.getFactoriesList(user_apikey[0], factoriesAdapter);
            });
            builder.setNegativeButton(R.string.dialog_apikey_enter_negative_button, (dialog, which) -> {
                user_apikey[0] = "DIALOG_CANCELED";
                Log.e(DEBUG_TAG_ERROR, "API key dialog canceled");
                Toast.makeText(activity, "Dialog canceled", Toast.LENGTH_LONG).show();
            });
            AlertDialog apikey_dialog = builder.create();
            apikey_dialog.show();
        }
    }

при печати «Третий ключFromDB»: "(см. в коде), ключ API есть, но тогда объект не вставляется в таблицу.

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

1 Ответ

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

Почему вы используете эти строки в вашей пользовательской сущности?

@Ignore
public User(String name, String apikey) {
    this.name = name;
    this.apikey = apikey;
}

@Ignore
public User() {
}

@Ignore игнорирует отмеченный элемент из логики обработки Room.

Эта аннотация может использоваться в нескольких местах, гдеКомнатный процессор работает.Например, вы можете добавить его в поле сущности, и комната не сохранит это поле.

Удалите его из вашей сущности пользователя, и он будет работать.

Для справки Определение данных с использованием сущностей Room

UPDATE:

Это единственная строка, в которую вы добавляете нового пользователя?userDao.insertUser(new User(1, "Main", user_apikey[0]));

Если да, то вернется только один пользователь, потому что все время вы вставляете 1 как uid, и он заменит предыдущего пользователя, так как uid является первичным ключом.

Надеюсь, это поможет вам.

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