2013-10-14 56 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