【问题标题】:Reflection issue, mapping database to object java-android反射问题,将数据库映射到对象 java-android
【发布时间】:2016-10-25 08:55:20
【问题描述】:

在这里,我遇到了这个一般性问题。我想实现一种能够在我的 android SQLite 数据库中选择所有项目的方法,同时遵守以下限制。

  • 应该是通用的;
  • 应该易于使用;

我在这里,让我尽我所能:

public <T extends GenericnessFactory<T>> List<T> selectAll(T returningClass){
    List<T> objects = new ArrayList<T>();

    String name = returningClass.getClass().getSimpleName();
    Field[] fields = returningClass.getClass().getFields();
    String[] columns = new String[fields.length];

    for(int i = 0; i < fields.length; i++){
        columns[i] = fields[i].getName();
    }

    SQLiteDatabase readable = getReadableDatabase();

    Cursor c = readable.query(name, columns, null,null, null, null, null);

    if(c.moveToFirst()){
        T item = returningClass.generate();


    }

    c.close();
    return objects;
}

我正在考虑将类名作为表名,将字段作为列,但现在我觉得很棘手,因为一旦 T 是泛型,我如何将光标绑定到泛型类型?

只是为了知识,这里是我的GenericnessFactory界面:

public interface GenericnessFactory<T> {

    public T generate();
}

任何解决方案都会让我高兴,但如果你能解释一下,我会很高兴理解你的解决方案。

【问题讨论】:

    标签: java android sqlite generics


    【解决方案1】:

    假设您的所有列都是 VARCHAR 类型,只需调用 java.lang.Field.set() 方法,传递光标读取的列的值。如果您想阅读其他类型,恐怕您将不得不编写一个丑陋的类型匹配级联来调用 setFloat() setDouble() 等。 检查目标字段是否不是最终的、静态的、瞬态的或私有的也是一个好主意。

    public <T extends GenericnessFactory<T>> List<T> selectAll(T returningClass){
        List<T> objects = new ArrayList<T>();
        String name = returningClass.getClass().getSimpleName();
        Field[] fields = returningClass.getClass().getFields();
        int fieldCount = fields.length;
        String[] columns = new String[fieldCount];
        HashMap<String,Field> fieldMap = new HashMap<String,Field>();
        for (int i = 0; i < fieldCount; i++) {
            Field fld = fields[i];
            int mods = fld.getModifiers();
            if (!Modifier.isFinal(mods) && ! Modifier.isTransient(mods) && !Modifier.isStatic(mods)) {
                columns[i] = fld.getName();
                fieldMap.put(columns[i], fld);
            }
        }
    
        SQLiteDatabase readable = getReadableDatabase();
    
        Cursor c = readable.query(name, columns, null,null, null, null, null);
    
        if (c.moveToFirst()) {
            T item = returningClass.generate();
            for (int i = 0; i < fieldCount; i++) {
                fieldMap.get(columns[i]).set(item, c.getString(i));
            }
        }
    
        c.close();
        return objects;
    }
    

    【讨论】:

      【解决方案2】:

      我会看一下 Tomato 库——它是一个没有依赖关系的 Java ORM,它非常小,而且速度很快,而且非常易于使用。

      网址是https://rpbarbati.github.io/Tomato

      【讨论】:

        猜你喜欢
        • 2017-03-16
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        相关资源
        最近更新 更多