我有一个使用Room Database的Android应用。我有几个表,除了一个-用户对象(表),它们都工作正常。我对所有对象(表)都使用相同的方法,但是仍然没有将数据插入到该对象中。该表仍然为空。即使填充其他表也很好。贝娄是我的代码。
在Fragment中,如果用户按下按钮,则会调用fabClickHandler方法。该方法检查数据库中是否已经存在用户。如果是,它将返回他的API密钥并用于请求。如果不存在,则要求输入API密钥。然后,它应该将其存储到数据库,但事实并非如此。下次再次询问时,我已经检查了表格,确实为空。
如果用用户对象手动填充表,一切正常。
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();
}
}
当我打印“ Third keyFromDB:”(参见代码)时,API密钥已经存在,但是该对象没有插入表中。
我不知道该怎么办。我以前使用过这种相同的数据库方法,从来没有遇到问题。
答案 0 :(得分:1)
为什么要在用户实体中使用这些行?
@Ignore
public User(String name, String apikey) {
this.name = name;
this.apikey = apikey;
}
@Ignore
public User() {
}
@Ignore
会忽略Room的处理逻辑中的标记元素。
此注释可以在运行Room处理器的多个地方使用。例如,您可以将其添加到实体的字段中,而Room不会保留该字段。
从您的用户实体中删除它,它将起作用。
供参考Defining data using Room entities
更新:
这是您插入新用户的唯一行吗? userDao.insertUser(new User(1, "Main", user_apikey[0]));
如果是,则它将仅返回一个用户,因为您一直将1
插入为uid
,并且它将替换先前的用户,因为uid
是主键
希望这对您有所帮助。