【发布时间】:2018-04-13 17:27:07
【问题描述】:
所以,我有以下方法在本地伪造数据库:
public class TestClassDao implements ClassDao {
// ...
private static List<ClassDto> classes = new ArrayList<>();
@Override
public List<ClassDto> getClassesByIds(List<Long> classIds) {
List<ClassDto> results = new ArrayList<>();
for (ClassDto classInstance : classes) {
if (classIds.contains(classInstance.getId())) {
results.add(classInstance);
}
}
return cloner.deepClone(results);
}
//...
}
我很困惑,因为结果总是空空如也。我在 Android Studio 中逐步调试了调试器,发现包含检查始终返回 false,即使已知存在正确的 ID。
用调试器跟踪 那个,我发现我怀疑是罪魁祸首:根据调试器,List<Long> classIds 包含 *Integer* 对象。是什么赋予了?我不确定如何进一步调试。
编辑:
编辑 2:
这是测试数据被加载到数据存储中的方式,您可以看到我正确地传递了Long 值:
下面的方法被一个对学校做类似事情的方法调用,然后通过测试DAO中的一个方法持久化。
public static ClassDto getClassTestData(int classId) {
ClassDto classDto = new ClassDto();
switch (classId) {
case 1:
classDto.setId(1L);
classDto.setName("207E - Mrs. Randolph");
classDto.setTeacher(getTeacherTestData());
classDto.setStudents(getStudentsTestData());
return classDto;
case 2:
classDto.setId(2L);
classDto.setName("209W - Mr. Burns");
classDto.setTeacher(getTeacherTestData());
return classDto;
case 3:
classDto.setId(3L);
classDto.setName("249E - Mr. Sorola");
classDto.setTeacher(getTeacherTestData());
return classDto;
default:
return null;
}
}
编辑 3:
这里是保存/检索学校信息的 DAO。问题发生在插入数据和删除数据之间的某个时间。它以Long 类型输入,以Int 类型输出
@Dao
public interface SchoolDao {
@Query("SELECT * FROM schools")
List<SchoolDto> getAllSchools();
@Insert
void insertSchool(SchoolDto schoolDto);
}
【问题讨论】:
-
getId() 是否返回
Long? -
是的,代码(用于 getter)在这里:
public Long getId() { return id; } -
您用来执行查询的工具正在为相关列生成一个
Integer对象。您需要使用整数列表或告诉数据库访问工具您希望该值为 Long。 -
您如何填充
List?他们进入列表时是Long吗? -
classIds是一个参数,并且不会被此方法更改,因此传入时整数就在其中。我猜想某处有对列表的原始引用,并且list.add(123)之类的事情正在发生,而不是123L。
标签: java android android-room