对象未插入到Room数据库中

时间:2018-09-25 16:05:53

标签: android database object android-room

我有一个使用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密钥已经存在,但是该对象没有插入表中。

我不知道该怎么办。我以前使用过这种相同的数据库方法,从来没有遇到问题。

1 个答案:

答案 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是主键

希望这对您有所帮助。