gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:45:57 29 4
gpt4 key购买 nike

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

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

我来了,让我尽我所能:

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 是通用的,我如何才能将我的游标绑定(bind)到通用类型?

仅供引用,这是我的 GenericnessFactory 接口(interface):

public interface GenericnessFactory<T> {

public T generate();
}

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

最佳答案

假设您所有的列都是 VARCHAR 类型,只需调用 java.lang.Field.set() 方法传递游标读取的列的值。如果你想阅读其他一些类型,恐怕你将不得不编写一个丑陋的类型匹配级联来调用 setFloat() setDouble() 等。检查目标字段是否不是最终的、静态的、 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;
}

关于java - 反射问题,将数据库映射到对象java-android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235575/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com