Android комната. ошибка: не могу понять, как прочитать это поле из курсора - PullRequest
0 голосов
/ 09 апреля 2020

База данных SQLite содержит три таблицы: 1) сотрудник 2) навыки 3) отделы. Идея в том, что в таблице сотрудников хранятся такие данные, как идентификатор, имя, фамилия, зарплата. Кроме того, у сотрудника есть такие данные, как квалификация и отдел, но может быть несколько данных для одного сотрудника, поэтому я создал две отдельные таблицы навыков и отделов и связал их, используя ключ к таблице сотрудников, где первичным ключом для сотрудника является id. Теперь с помощью идентификатора мне нужно отобразить всю информацию о сотруднике, включая его навыки, которых может быть несколько и отделов. Я реализую весь процесс, используя библиотеку ROOM.

Вот запрос, который я делаю

@Query("SELECT employ.id ,employ.name ,employ.last_name, employ.salary, " +
        "skill.skill, department.department_name FROM employ INNER JOIN skill,department " +
        "ON employ.id = :id AND skill.employ_id = :id AND department.employ_id = :id ")
AllAboutEmployee getAllAboutEmployee(String id);

Вот класс AllAboutEmployee, объект которого принимает результат запроса

public class AllAboutEmployee {

@ColumnInfo(name = "id")
private String id;

@ColumnInfo(name = "name")
private String name;

@ColumnInfo(name = "last_name")
private String lastName;

@ColumnInfo(name = "salary")
private String salary;

@ColumnInfo(name = "department_name")
private List<String> departmentsList; // THE ERROR IS ON THIS LINE

@ColumnInfo(name = "skill")
private List<String> skillList; // THE ERROR IS ON THIS  LINE

public AllAboutEmployee(String id, String name, String lastName, String salary, List<String> departmentsList, List<String> skillList) {
    this.id = id;
    this.name = name;
    this.lastName = lastName;
    this.salary = salary;
    this.departmentsList = departmentsList;
    this.skillList = skillList;
}
public String getId() {
    return id;
}

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

public String getName() {
    return name;
}

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

public String getLastName() {
    return lastName;
}

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

public String getSalary() {
    return salary;
}

public void setSalary(String salary) {
    this.salary = salary;
}

public List<String> getDepartmentsList() {
    return departmentsList;
}

public void setDepartmentsList(List<String> departmentsList) {
    this.departmentsList = departmentsList;
}

public List<String> getSkillList() {
    return skillList;
}

public void setSkillList(List<String> skillList) {
    this.skillList = skillList;
}

}

Итак, в классе AllAboutEmployee есть два поля с типом List, чтобы разместить там несколько навыков и несколько отделов. Именно в этих полях возникает ошибка. Заранее благодарю за помощь

1 Ответ

0 голосов
/ 09 апреля 2020

Ух ты ... это так круто .. Я кодировал весь день и тоже получил эту ошибку! Вы должны создать TypeCoverter для хранения ваших данных в базе данных вашей комнаты.

В этом случае у вас есть два списка, которые не распознаются типом базы данных, поэтому вам нужно создать конвертер для его сохранения в виде Строка и другой способ сделать обратное.

Что-то вроде:

class TypeCoverter{
 @TypeConverter
        fun arrayListToString(arrayList: ArrayList<String>?): String? {
            if (arrayList.isNullOrEmpty()) return null
            val string = StringBuilder()
            for (item in arrayList) {
                val isNotTheLastItemInTheArrayList = (item == arrayList.last()).not()
                if (isNotTheLastItemInTheArrayList) {
                    string.append(item).append(COMMA)
                } else {
                    string.append(item)
                }
            }
            return string.toString()
        }
}

  @TypeConverter
        fun stringToArrayList(string: String?): ArrayList<String>? {
            when {
                string.isNullOrEmpty() -> {
                    return null
                }
                string.contains(COMMA).not() -> {
                    val list = ArrayList<String>()
                    list.add(string)
                    return list
                }
                else -> {
                    return string.split(COMMA.toRegex()).dropLastWhile { it.isEmpty() } as ArrayList<String>
                }
            }
        }

На самом деле это Kotlin, но вы можете увидеть, как это работает.

...