2013-10-14 58 views
2

我提出这个作为bug on the ORMLite Sourceforge bug tracker但我还没有看到任何更新。我没有看到任何流程文档说我是否需要做任何事情将其传递给Gray?OrmLiteConfigUtil配置文件生成问题

看到测试版本v4.47(旧版ORMLite版本的行为更糟​​糕,因为配置文件生成失败的时间早得多)。

我的@DatabaseTable类都包含一些Android导入,例如,

import android.content.Context; 

我的大部分类都扩展了一个抽象超类,

@DatabaseTable(tableName = SongMessage.TABLE_NAME) 
public class SongMessage extends AbstractMessage { 

但是,我的一些类扩展了一个共享的抽象超类,例如,

@DatabaseTable(tableName = PhotoMessage.TABLE_NAME) 
public class PhotoMessage extends SingleImageMessage implements <snip> { 

SingleImageMes​​sage延伸相同的公共的AbstractMessage:

public abstract class SingleImageMessage extends AbstractMessage { 

运行我OrmLiteConfigUtil正常工作对我的直接子类,但其扩展中间抽象类的那些不起作用:

... 
Wrote config for class com.mypackage.TextMessage 
Skipping class com.mypackage.PhotoMessage because we got an error finding its definition: android/content/Context 
Wrote config for class com.mypackage.SongMessage 
... 
+0

我的问题与你无关。我只是好奇为什么你需要在模型中的Android上下文? –

+0

在这个特定的情况下,我有一个getDisplayPreview(Context)方法,它对于每种消息类型都是不同的。某些消息类型使用本地化的文本资源,这需要Context来检索它们。我可以删除Context参数,但是在那种情况下,我需要在本地获取一个Context,这仍然需要导入。我还在一些消息类型中使用了LayoutParams和Bitmap,尽管这些使用可能更容易被重构。 –

回答

0

我可能需要看到更多的抽象类定义。该错误可能来自DatabaseFieldConfig.fromField调用。该错误消息表明它试图为android.content.Context查找数据库类型定义。在抽象类中是否存在一个属于该类型的字段?以下是生成您所看到的错误消息的代码。

private static void writeConfigForTable(BufferedWriter writer, Class<?> clazz) throws SQLException, IOException { 
    String tableName = DatabaseTableConfig.extractTableName(clazz); 
    List<DatabaseFieldConfig> fieldConfigs = new ArrayList<DatabaseFieldConfig>(); 
    // walk up the classes finding the fields 
    try { 
     for (Class<?> working = clazz; working != null; working = working.getSuperclass()) { 
      for (Field field : working.getDeclaredFields()) { 
       DatabaseFieldConfig fieldConfig = DatabaseFieldConfig.fromField(databaseType, tableName, field); 
       if (fieldConfig != null) { 
        fieldConfigs.add(fieldConfig); 
       } 
      } 
     } 
    } catch (Error e) { 
     System.err.println("Skipping " + clazz + " because we got an error finding its definition: " 
       + e.getMessage()); 
     return; 
    } 
    if (fieldConfigs.isEmpty()) { 
     System.out.println("Skipping " + clazz + " because no annotated fields found"); 
     return; 
    } 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    DatabaseTableConfig<?> tableConfig = new DatabaseTableConfig(clazz, tableName, fieldConfigs); 
    DatabaseTableConfigLoader.write(writer, tableConfig); 
    writer.append("#################################"); 
    writer.newLine(); 
    System.out.println("Wrote config for " + clazz); 
} 
+0

getSuperclass的文档在哪里说InstantiationException?我看不到它...... –

+0

你是对的。我注意到的例外与同一文本中的另一种方法有关。我已经更新了我的答案。您是否尝试删除对android.content.Context类的任何引用以查看错误是否仍然存在?如果这不是富有成效的话,我可以在你的鞋子里加入OrmLite来源到我的项目中并逐步完成。这很丑陋,但你可以肯定它会帮助你理解这个问题。 – Josh

1

对不起,我迟交了。 ORMLite已经有点换了。

运行我OrmLiteConfigUtil正常工作对我的直接子类,但其扩展中间抽象类的那些不起作用:

这个问题显然是因为Context进口。不幸的是,OrmLiteConfigUtil在本地运行,无法访问该类,该类只能由Google导出为存根。

我能做的一件事就是只有当超类无法调查时才会发现并记录错误。所以这个子类将被正确输出。这会起作用吗?

+0

对我来说,这将工作,格雷。 – Christine