2013-10-14 2 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 { 

그러나 일부 클래스는 공유 추상 수퍼 클래스를 확장합니다. 내 OrmLiteConfigUtil 내 직접 서브 클래스 잘 작동 실행

public abstract class SingleImageMessage extends AbstractMessage { 

다만, 중간 추상 클래스 확장 사람을 위해 작동하지 않습니다 :

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

SingleImageMessage 같은 일반적인 경우 AbstractMessage를 확장

... 
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

내 질문은 귀하와 관련이 없습니다. 왜 모델에 안드로이드 컨텍스트가 필요한지 궁금합니다. –

+0

이 특정 경우에는 각 메시지 유형마다 다른 getDisplayPreview (Context) 메소드가 있습니다. 일부 메시지 유형은 현지화 된 텍스트 리소스를 사용합니다. 컨텍스트가이를 검색해야합니다. Context 매개 변수를 제거 할 수는 있지만 그 경우 Context를 로컬로 가져와야합니다.이 경우에도 가져 오기가 필요합니다. 또한 레이아웃 매개 변수와 비트 맵을 일부 메시지 유형에서 사용합니다. 그러나 이러한 용도는보다 쉽게 ​​리팩토링 될 수 있습니다. –

답변

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