首页 > 解决方案 > Android 与 spinner 的一对多关系

问题描述

我有一个带有房间数据库的 Android 项目,我正在尝试使用 id 建立一对多的关系。所以在我的实体中,我添加了以下内容:

package com.app.entity.author;

import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;
import androidx.annotation.NonNull;

import com.app.entity.department.Department;
import com.app.entity.university.University;

@Entity(tableName = "author", foreignKeys = {
        @ForeignKey(
                entity = University.class,
                parentColumns = "id",
                childColumns = "university"
        ),
        @ForeignKey(
                entity = Department.class,
                parentColumns = "id",
                childColumns = "department"
        )
})
public class Author {

    @PrimaryKey(autoGenerate = true)
    private Integer id;
    @NonNull
    private String firstName;
    @NonNull
    private String lastName;
    @NonNull
    private String email;
    @NonNull
    private Integer university;
    @NonNull
    private Integer department;
    private String phone;
    private String mobile;
    private String profile;

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setUniversity(Integer university) {
        this.university = university;
    }

    public Integer getUniversity() {
        return university;
    }

    public void setDepartment(Integer department) {
        this.department = department;
    }

    public Integer getDepartment() {
        return department;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getPhone() {
        return phone;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getMobile() {
        return mobile;
    }

    public void setProfile(String profile) {
        this.profile = profile;
    }

    public String getProfile() {
        return profile;
    }


    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        return this.getId() == ((Author) obj).getId();
    }

    @Override
    public String toString() {
        StringBuffer buf = new StringBuffer();
        buf.append(this.firstName).append(" ");
        buf.append(this.lastName).append(" ");
        buf.append(this.email).append(" ");
        buf.append(this.university).append(" ");
        buf.append(this.department).append(" ");
        buf.append(this.phone).append(" ");
        buf.append(this.mobile).append(" ");
        buf.append(this.profile).append(" ");
        return buf.toString();
    }

}

在我的 AddActivity 我有以下内容:

universityRepository = new UniversityRepository(this);
universityRepository.getAllUniversitys().observe(this, new Observer<List<University>>() {
    @Override
    public void onChanged(List<University> university) {
        ArrayAdapter<University> universityAdapter = new ArrayAdapter<>(AddNewAuthorActivity.this,
        android.R.layout.simple_list_item_1, university);
        universityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        universityEditText.setAdapter(universityAdapter); 
    }
});

saveButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Author author = new Author();
        author.setFirstName(firstNameEditText.getText().toString());
        author.setLastName(lastNameEditText.getText().toString());
        author.setEmail(emailEditText.getText().toString());
        University university = (University) universityEditText.getSelectedItem();
        author.setUniversity(university.getId()) ;
        Department department = (Department) departmentEditText.getSelectedItem();
        author.setDepartment(department.getId());
        author.setPhone(phoneEditText.getText().toString());
        author.setMobile(mobileEditText.getText().toString());
        author.setProfile(profileEditText.getText().toString());
        authorRepository.insert(author);
        finish();
    }
});

在我的适配器中,我有以下内容:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Author author = authors.get(position);
    holder.idTextView.setText(String.valueOf(author.getId()));
    holder.firstNameTextView.setText(String.valueOf(author.getFirstName()));
    holder.lastNameTextView.setText(String.valueOf(author.getLastName()));
    holder.emailTextView.setText(String.valueOf(author.getEmail()));
    holder.universityTextView.setText(String.valueOf(author.getUniversity()));
    holder.departmentTextView.setText(String.valueOf(author.getDepartment()));
    holder.phoneTextView.setText(String.valueOf(author.getPhone()));
    holder.mobileTextView.setText(String.valueOf(author.getMobile()));
    holder.profileTextView.setText(String.valueOf(author.getProfile()));
}

大学.java:

import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.io.Serializable;
import androidx.annotation.NonNull;


@Entity(tableName = "university", foreignKeys = {
})
public class University implements Serializable {

    @PrimaryKey(autoGenerate = true)
    private Integer id;
    @NonNull
    private String name;

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }


    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        return this.getId() == ((University) obj).getId();
    }

    @Override
    public String toString(){
        StringBuffer buf = new StringBuffer();
        buf.append(this.name).append(" ");
        return buf.toString();
    }

}

结果表明我正在接近我想要的,但我不知道如何实现以下目标的唯一问题:

在我的添加活动中,我希望 Spinner 只有大学的名称而不是整个对象,并且在我的适配器中,我想在用户列出作者数据时返回大学名称而不仅仅是 id,对不起这么简单问题,但我是 Android 新手,几天来一直在谷歌上寻找这样的案例,但没有运气。

标签: androidsqlforeign-keysandroid-spinnerandroid-room

解决方案


推荐阅读