所以,我有以下方法在本地伪造数据库:
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);
}
答案 0 :(得分:1)
我创建了一个TypeConverter
来将List<Integer>
转换为字符串(并返回),以便它可以存储在房间内DB中的单个列中,而无需修改现有的DTO 。但是,当我切换到使用Long
类型作为ID时,我无法在转换器中转换下面的单个泛型参数;仔细查看以下代码:
public class IdsListConverter {
@TypeConverter
public List<Long> idsFromString(String value) {
Gson gson = new Gson();
if (value == null || value.isEmpty()) {
return null;
} else {
Type resultType = new TypeToken<List<Integer>>(){}.getType();
return gson.fromJson(value, resultType);
}
}
@TypeConverter
public String idsToString(List<Long> ids) {
if (ids == null) {
return null;
} else {
Gson gson = new Gson();
return gson.toJson(ids);
}
}
}
答案 1 :(得分:1)
It looks like您发现了问题:
Type resultType = new TypeToken<List<Integer>>(){}.getType();
return gson.fromJson(value, resultType);
(在返回List<Long>
的方法中)应该是:
Type resultType = new TypeToken<List<Long>>(){}.getType();
有一种类型安全的方法来编写它,这会在编译时解决问题:
TypeToke<List<Integer>> resultTypeToken = new TypeToken<List<Integer>>() {};
return gson.getAdapter(resultTypeToken).fromJson(value);
这不会编译,因为return语句的类型与方法的返回类型不兼容。
可能值得寻找fromJson
的其他事件,以便您可以迁移它们并查看是否还有其他问题尚未找到!
答案 2 :(得分:0)
你看错了变量。 ClassDao实例在下面,你可以看到“{Long @ 6495}”1“。但你传播的整数”1“是你的代码中省略的ClassIds的元素。你确定ClassIds是List(),当添加元素时,你应该做classIds.add(new Long(1))。
答案 3 :(得分:-1)
为了将来参考,此投射规则列表将为您提供帮助。从本质上讲,我认为存在隐性的冲突。
byte –> short –> int –> long –> float –> double