Android Room получает автоматически сгенерированный идентификатор и помещает в дочерние строки - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь извлечь вставленную «Группу» и вставить «Члены» в базу данных. Моя идея состоит в том, чтобы получить Группу с автоматически сгенерированным идентификатором, установить ее в качестве внешнего ключа в Участниках и вставить их в базу данных Room. Пожалуйста, оставьте свои примеры и идеи, как решить эту проблему.

Репо: моя идея - извлечь его из AsyncTask, но я не знаю, как отправить результат обратно в метод

public class GroupRepo{
private final GroupDao groupDao;
private final MemberDao memberDao;

public GroupRepo (Context context){
    DatabaseConfig db = DatabaseConfig.getDatabase(context);
    groupDao = db.groupDao();
    memberDao = db.memberDao();
}

public List<Group> getNonLiveGroup() {
    List<Group> result = null;
    new AsyncTask<Void, Void, List<Group>>() {
        @Override
        protected List<Group> doInBackground(Void... voids) {
            List<Group> m = null;
                m = groupDao.getGroup();
            return m;
        }
        @Override
        protected void onPostExecute(List<Group> group){
        }
    }.execute();
    return null;
}

Член организации:

 @Entity(tableName = "member",
    foreignKeys = @ForeignKey(entity = Group.class,
    parentColumns = "id",
    childColumns = "groupsId",
    onDelete = CASCADE))
public class Member {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
    public int groupsId;

public void setGroupsId(int groupsId){
    this.groupsId = groupsId;
}
}

Могут быть и другие способы сделать это, и, пожалуйста, покажите мне краткий пример.

Ответы [ 2 ]

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

Хорошо, теперь я представлю свой подход, как это реализовано.

Это сущности:

@Entity(tableName = "groups", 
        indices = {@Index(value = {"id"}, unique = true)})
public class Group {

    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;

}


@Entity(tableName = "member",
        indices = {@Index(value = {"id"}, unique = true)},
        foreignKeys = {@ForeignKey(
                entity = Group.class,
                parentColumns = "id",
                childColumns = "groupId",
                onUpdate = CASCADE, onDelete = CASCADE)})
public class Member {

    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
    public int groupId;

    public void setGroupId(int groupId){
        this.groupId = groupId;
    }
}

Когда у вас уже есть ваши сущности, вы должны создать Отношения между ними. Я делаю это с помощью одного дополнительного класса, который расширяет Group @Entity class и содержит список с членами List<Member>.

public class GroupWithMembsers extends Group {

    @Relation(parentColumn = "id", entityColumn = "groupId", entity = Member.class)
    private List<Member> members;

    public List<Member> getMembers(){
        return this.members;
    }

} 

Теперь, когда у вас есть все группы и все участники, вы должны установить идентификатор группы всех участников. И теперь вы можете вставить все данные в базу данных следующим образом:

@Dao
public abstract class GroupDao {

    @Transaction
    public void insertGroupWithMembsers(List<GroupWithMembsers> groupWithMembsers, RulesOfGolfDatabase database) {
        if (groupWithMembsers != null && database != null) {
            //First have to insert the entities which holds the @Relation
            insertGroups(groupWithMembsers);
            for (GroupWithMembsers group : groupWithMembsers) {
                //Now you can insert members, because thier foreignKeys (groupId) is already inserted into the Database
                database.memberDao().insertMembers(groupWithMembsers.getMembers());
            }
        }
    }

}

Если у вас есть какие-либо вопросы, просто спросите. Надеюсь, я как-то помог:)

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

В groupDao, когда вы вставляете новую группу, сделайте метод добавления return int. поэтому он вернет добавленный идентификатор. например

@Insert
int addNewGroup(Group Group)

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

    new AsyncTask<Void, Void,Void>() {
            @Override
            protected Void doInBackground(Void... voids) {
             int id=  groupDao.insert(YOUR_GROUP_OBJECT);
             memberDao.insert(new Member(YOUR_NAME,id));
            }
            @Override
            protected void onPostExecute(Void group){
            }
        }.execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...