2017-03-31 5 views
0

안드로이드에 대한 최근 프로젝트에서 일대 다 관계와 간단한 일대일 관계를 모델링하기 위해 OrmLite를 사용했습니다. Ive는 일대 다 관계에서 자식이 데이터베이스의 부모에 대한 외래 키 참조를 보유하고 있음을 확인했습니다. 부모 개체를 로딩 할 때 여전히 OrmLite는 무엇을해야하는지 알고 있으며 물론 원하는 동작 인 자식 요소의 컬렉션을로드합니다.안드로이드 OrmLite 외래 키/해외 컬렉션

그러나 단순한 일대일 관계에서는 동일한 동작을 수행하기 위해 부모 개체가 외래 키 열을 보유해야합니다.

실제 질문 : 일대 다 관계의 표준 동작이므로 외래 키만 자식에 설정되어있는 경우 OrmLite가 하위 개체를 일대일 관계로로드 할 수 있습니까? ? 단순히 설정 자식 2를 저장할 때 그래서

public class Child1/Child2 
{  

    @DatabaseField(foreign = true) 
    private Parent parent; 
} 

:이 같은 부모에 대한 참조가 필요

@DatabaseTable 
public class Parent 
{ 

@DatabaseField(foreign = true) 
private Child1 child1; 

@ForeignCollectionField 
private Collection<Child2> children2; 

} 
아이 1 그래서

2 : 여기

몇 가지 예제 코드입니다

child2.setParent(parent); 
child2Dao.create(child2) 

하지만 child1과 child2를 포함하여 부모를 쿼리 할 때 동일한 동작을하기 위해서는 LD 주변의 관계를 다른 방법으로 저장해야합니다 : 내가 원하는대로이 매우 불편

parent.setChild1(child1) 
parentDao.create(parent) 

중 자식 1/자식 2 모두 부모의 외래 키 또는 다른 방법으로 주위를 들고. 그러나 혼합물은 다소 추한 것처럼 보인다!

아이디어를 얻는 방법은 무엇입니까?

Ive가이 질문에 대한 답변을 검색했지만 찾을 수 없습니다. 중복 된 경우, 죄송합니다!

대단히 감사합니다!

편집 :

더 정확하게 할 수 : 은 가능한 내 자식 1 테이블의 외래 키를 설정하고 여전히 부모에 대한 쿼리 할 때 자식 1을 얻을 수있을 것입니다. ORMLite는 child2의 외국 컬렉션을 자동으로 처리합니다. 나는 아이에게도 똑같은 행동을 원한다 .1. 하지만 부모 테이블이 자식 1에 대한 참조 (외래 키)를 가지고 있지 않기 때문에

Parent parent = parentDao.queryForId(1) 

유일한 자식 2를 얻을 수 쿼리를 만들 다음

child1.setParent(parent); 
child1Dao.create(child1); 

을 설정 한 경우. child1만이 상위에 대한 참조를 갖습니다.

그래서 : OrmLite가 부모 외래 키 열을 자동으로 업데이트하도록하거나, 부모에 외래 키가 설정되어 있지 않아도 Ormlite에게 여전히 child1을 가져 오라고 말하고 싶습니다 (이는 child2 모음과 동일합니다). 어떻게 든 가능합니까? 안 그래요?

나는 이것이 너무 혼란스럽지 않기를 바래요. :) 부모님의 외래 키를 설정하는 것이 더 간단하다는 것을 전적으로 알고 있습니다.그러나 부모님의 외래 키를 가지고있는 어린이들과 그렇지 않은 어린이들로 끝나기 때문에 나는 그 접근법을 정말로 싫어합니다.

당신에게

답변

0

ORMLite이 필드 중 하나 이상이 동일한 데이터베이스에 다른 테이블에 유지됩니다 객체에 해당하는 "외국인"객체의 개념을 지원 대단히 감사합니다. 예를 들어 데이터베이스에 Order 객체가 있고 각 Order에 해당 Account 객체가있는 경우 Order 객체에는 Foreign Account 필드가 있습니다. 이물질이 있으면 계정의 id 필드가 Order 테이블에 "account_id"열로 유지됩니다. 예를 들어, 주문 클래스는 같은 것을 볼 수 있습니다

@DatabaseTable(tableName = "orders") 
public class Order { 

    @DatabaseField(generatedId = true) 
    private int id; 

    @DatabaseField(canBeNull = false, foreign = true) 
    private Account account; 
    … 
} 

주문 테이블을 만들 때, 다음과 같은 SQL과 같이 생성된다 :

당신이 외국으로 필드를 만드는
CREATE TABLE `orders` 
    (`id` INTEGER AUTO_INCREMENT , `account_id` INTEGER, 
    PRIMARY KEY (`id`)); 

개체는 자동으로 외부 개체가 만들어지지 않습니다. 이물질이 데이터베이스에 의해 제공되는 생성 된 ID를 가지고 있다면 그것을 참조하는 객체를 생성하기 전에 생성해야합니다. 예 :

Account account = new Account("Jim Coakley"); 
accountDao.create(account); 
// this will create the account object and set any generated ids 

// now we can set the account on the order and create it 
Order order = new Order("Jim Sanders", 12.34); 
order.setAccount(account); 
… 
orderDao.create(order); 

해외 컬렉션을 사용하면 계정 테이블에 주문 모음을 추가 할 수 있습니다. 계정 개체가 쿼리에 의해 반환되거나 DAO에 의해 새로 고쳐질 때마다 주문 테이블에 대한 별도의 쿼리가 만들어지고 계정에 주문 컬렉션이 설정됩니다. 컬렉션의 모든 주문에는 해당 계정과 일치하는 해당 이물이 있습니다. 예를 들어 위의 예에서

public class Account { 
    … 
    @ForeignCollectionField(eager = false) 
    ForeignCollection<Order> orders; 
    … 
} 

@ForeignCollectionField 주석은 주문 필드가 계정과 일치하는 주문의 집합이라고 표시합니다. 필드 형식의 주문은 ForeignCollection 또는 Collection 중 하나 여야합니다. 지원하는 방법이 많을수록 훨씬 더 무겁기 때문에 다른 컬렉션도 지원되지 않습니다.

출처 : http://ormlite.com/

+0

는 당신에게 당신의 빠른 응답 주셔서 대단히 감사 설정하여 그것을 달성 할 수있다! Im은 MS 엔터티 프레임 워크 backround에서 오는 임으로 ORM의 기본 기능을 완전히 알고 있습니다. 나는 나의 질문에 대해 아주 분명하지 않았던 것으로 보인다. 나는 갱신하려고 노력할 것이다. –

+0

그래서 편집을보십시오. 사실 아마도 외래 키를 저장하지 않는 @ForeignField (OrmLite에 존재하지 않는다고 가정)와 같은 것이 필요할 것입니다. 그러나 ORMLite는 Account (부모)를 질의 할 때 ORDite (자식)를 포함하도록 알려줍니다. –

0

ORMLite documentation에 따르면, DatabaseField 사실 canBeNull =으로, 기본적으로있다. 따라서 Child1을 만들 때 Parent를 설정할 필요가 없습니다. 부모에서 Childs를 가져 오거나 그 반대의 경우에는 foreignAutoRefresh = true를 설정할 수 있습니다. 당신은 단지 하나 개의 테이블에서 외래 키 열을 남겨 둡니다

, 어쩌면 당신은 maxForeignAutoRefreshLevel = 1.

+0

감사합니다. 응창 성가! 불행히도 이것은 내가 찾던 것이 아닙니다. 나는 ForeignAutorefresh를 알고 있지만 내 질문은 다른 방향을 목표로합니다. 나는 내 질문을 업데이트 할 것이다. –

+0

나는 당신의 질문을 이해했습니다. ORMLite 설명서에서 대답을 찾지 못했지만 ORMLite 개발팀에 질문을 보내보십시오. – Alexandre

+0

그래, 고마워! 그것을 시도 할 것입니다. –