하루 종일 고생하고 있습니다. 나는 올바른 솔루션에서 한 주석을 얻은 것처럼 느낍니다.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을 지정해야합니까? 상황이 올바르게 저장되지 않았는지 또는 올바르게 검색하지 못했는지 알 수 없습니다.
좋아, 내가 그것을 제거했지만, 나는 그것을 검색 할 수 없기 때문에 물건이 저장되고 있는지 말할 수 없다. 일단 A 객체가 생기면 B의 List를 어떻게 가져 옵니까? – Leo
위의'load()'함수가 작동 할 것으로 기대 했었습니다 ... 데이터베이스에 올바르게 저장되었는지 확인하려면 에뮬레이터에서 sqlite 파일을 가져와야합니다. "adb pull/data/data/your .package.name/databases/yourdatabasefilename "이라면 http://sourceforge.net/projects/sqlitebrowser/와 같은 도구를 사용하여 B 테이블에 적절한 외부 ID 필드가 채워지는지 확인할 수 있습니다. – sddamico
네, 저의 저축 기능에 실수가 있다고 생각합니다. 몇 번 더 몇 가지를 바꿨지 만 지금은 매력처럼 작동합니다. – Leo