从自定义对象到sqlite行的动态强制转换

时间:2013-02-13 10:47:29

标签: java android reflection android-sqlite

我有一个电影表,其中有许多列和一个类,它以相同的顺序表示具有相同列/字段类型的表(一个int用于id,所有其他都是字符串)我有这个代码试图插入一个将对象movie中的电影记录到数据库中。 我遇到一个问题,说方法put无法接受该组或参数(String, capture#2-of ?)有什么比解决我的问题更好或更差的方法? 你EDIT:能解释一下我为什么错了吗?

ContentValues contentValues = new ContentValues();
Field[] fields = movie.getClass().getFields();
for(int i = 0; i < fields.length; i++)
{
    contentValues.put(allColumns[i], fields[i].getType().cast(fields[i].get(movie)));
}

2 个答案:

答案 0 :(得分:2)

fields[i].getType().cast(fields[i].get(movie))返回Object类型,并且put(...)没有重载,它将Object作为其第二个参数。

使用内容值add(...)方法时,首先应将值转换为原始类型,如int,String,boolean,long或byte []

您可以将数据序列化为blob(作为字节数组)或其他表示形式,例如String。

编辑:请参阅注释,看起来Field.getType()返回一个通用类,您需要在调用cast()之前进行转换,即: -

Class<String> fieldType = (Class<String>) fields[i].getType();

但这不会帮助你进一步发展,因为你需要事先了解类型,你可以做的就是这样:

ContentValues contentValues = new ContentValues();
Field[] fields = movie.getClass().getFields();
for(int i = 0; i < fields.length; i++)
{
        Class<?> fieldType = fields[i].getType();

        if(String.class.isAssignableFrom(fieldType)) {
            contentValues.put(allColumns[i], (String) fields[i].get(movie));
        } else if(Integer.class.isAssignableFrom(fieldType)) {
            contentValues.put(allColumns[i], (Integer) fields[i].get(movie));
        }
        ...and so on for all types
}

答案 1 :(得分:0)

您可以使用ORMLite之类的东西来管理数据库查询。 以下是与Android

一起使用的documentation