为什么我的List <long>包含整数?

时间:2018-04-13 17:27:08

标签: java android android-room

所以,我有以下方法在本地伪造数据库:

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 * 对象。是什么赋予了?我不确定如何进一步调试它。

编辑:

这是问题所基于的调试器输出: enter image description here

编辑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);

    }

4 个答案:

答案 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