У меня есть приложение для 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 есть, но тогда объект не вставляется в таблицу.
Я не знаю, что мне еще делать.Я использовал этот же подход к БД ранее, и у меня никогда не было проблем.