2014-07-08 7 views
2

하루 종일 고생하고 있습니다. 나는 올바른 솔루션에서 한 주석을 얻은 것처럼 느낍니다.Gson과 Ormlite ForeignCollection

API에서 JSON을 가져오고 Gley를 사용하여 Volley 요청 내에서 객체로 파싱합니다. 그런 다음 ORMLite를 사용하여 DB에 객체를 저장하려고합니다.

문제는 내 JSON에 다른 개체의 목록이 있다는 것입니다. 그래서 ForeignCollection이 필요하다고 결정했습니다. 여기

내가 JSON으로 얻고 어떤 버전의 단순화 : B, 내부의 "C"를하고,

{ 
    "b": [ 
     {"title"="abc","id="24sfs"}, 
     {"title"="def", "id="532df"} 
    ], 
    "c": [ 
     {"description"="abc","id="34325"}, 
     {"description"="def", "id="34321"} 
    ], 
    "id"="ejsa" 
} 

이 "B"안에이 모든 개체 클래스 A를 객체를 호출 할 수 있습니다를, 클래스 C.

B 및 C는 유사하다. 이것에 의해, 다음의 클래스 정의가됩니다.

class A { 

    @DatabaseField(index = true, unique = true, id = true) 
    private String id; 
    @ForeignCollectionField(eager = true) 
    public Collection<B> bCollection; 
    public ArrayList<B> b; 
    @ForeignCollectionField(eager = true) 
    public Collection<C> cCollection; 
    public ArrayList<C> c; 
} 

class B { 
    @DatabaseField(foreign=true) 
    public A a; 
    @DatabaseField(id = true, index = true, unique = true) 
    public String id; 
    @DatabaseField 
    public String title; 
} 

ArrayList b와 c가 필요한 이유는 gson이 올바르게 구문 분석 할 수 있도록하기 위해서입니다. 내가 메모리에 클래스 A를 일단 그래서, 여기에 내가

private void storeA(A a) { 
    if (a.b != null) { 
     getHelper().getDao(B.class).callBatchTasks(new Callable<Void>() { 
      @Override 
      public Void call() throws Exception { 
       for (B b : a.b) { 
        b.a = a; 
        try { 
         getHelper().getDao(B.class).createOrUpdate(b); 
        } catch (Exception e) { 
        } 
       } 
       return null; 
      } 
     }); 
    } 

    /* 
    Here we start running into problems. I need to move the data from the ArrayList to the Collection 
    */ 
    a.bCollection = a.b; // but this seems to work, since bCollection is a Collection 
    a.cCollection = a.c; 
    getHelper().getDao(A.class).createOrUpdate(a); 
} 

는 그래서, 오류가 지금까지의 내가 말할 수있는 제대로 저장하는 것 같다 저장 할 것입니다. 그러나 다음과 같이 검색하려고하면 bCollection에서 아무 것도 검색 할 수 없습니다.

private void load() { 
    try { 
     List<A> as = getHelper().getDao(A.class).queryForEq("id", "ejsa"); 
     if (as != null && as.size() > 0) { 
      A a = as.get(0); 
      CloseableWrappedIterable<B> cwi = a.bCollection.getWrappedIterable(); 

      try { 
       for (B b : cwi) { 
        Log.e(b.title); 
       } 
      } finally { 
       cwi.close(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

무엇이 잘못 되었나요? 이 중 일부에 foreignColumnName을 지정해야합니까? 상황이 올바르게 저장되지 않았는지 또는 올바르게 검색하지 못했는지 알 수 없습니다.

답변

1

나는 다음 두 줄을 제거하려고 할 것입니다 : 당신은 쿼리 할 때

a.bCollection = a.b; 
a.cCollection = a.c; 

A의 ForeignCollection 's이 (가) ORMLite에 의해 마술처럼 자동으로 채워해야합니다, 당신은 그들에게 자신을 설정할 필요가 없습니다.

+0

좋아, 내가 그것을 제거했지만, 나는 그것을 검색 할 수 없기 때문에 물건이 저장되고 있는지 말할 수 없다. 일단 A 객체가 생기면 B의 List를 어떻게 가져 옵니까? – Leo

+0

위의'load()'함수가 작동 할 것으로 기대 했었습니다 ... 데이터베이스에 올바르게 저장되었는지 확인하려면 에뮬레이터에서 sqlite 파일을 가져와야합니다. "adb pull/data/data/your .package.name/databases/yourdatabasefilename "이라면 http://sourceforge.net/projects/sqlitebrowser/와 같은 도구를 사용하여 B 테이블에 적절한 외부 ID 필드가 채워지는지 확인할 수 있습니다. – sddamico

+0

네, 저의 저축 기능에 실수가 있다고 생각합니다. 몇 번 더 몇 가지를 바꿨지 만 지금은 매력처럼 작동합니다. – Leo