反射问题,将数据库映射到java android对象

反射问题,将数据库映射到java android对象,java,android,sqlite,generics,Java,Android,Sqlite,Generics,这是一个通用问题。我想实现一种方法,能够选择我的android SQLite数据库中的所有iTen,遵守以下限制 应该是通用的 应易于使用 我在这里,让我尽我所能展示: public <T extends GenericnessFactory<T>> List<T> selectAll(T returningClass){ List<T> objects = new ArrayList<T>(); String n

这是一个通用问题。我想实现一种方法,能够选择我的android SQLite数据库中的所有iTen,遵守以下限制

  • 应该是通用的
  • 应易于使用
我在这里,让我尽我所能展示:

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;
}

任何解决方案都会让我感到高兴,但如果您能解释,我会很高兴理解您的解决方案。

假设您的所有列都是VARCHAR类型,只需调用java.lang.Field.set()方法传递光标读取的列的值即可。如果您想读取其他类型,恐怕您必须编写一个丑陋的类型匹配级联来调用setFloat()setDouble()等。 检查目标字段是否为final、static、transient或private也是一个好主意

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;
}
public List selectAll(T returningClass){
列表对象=新的ArrayList();
字符串名称=returningClass.getClass().getSimpleName();
Field[]fields=returningClass.getClass().getFields();
int fieldCount=fields.length;
String[]columns=新字符串[fieldCount];
HashMap fieldMap=新的HashMap();
对于(int i=0;i
我想看看西红柿库——它是一个java ORM,没有依赖性,非常小,速度非常快,使用非常方便

网址是

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;
}