2013-06-24 6 views
2

테이블 행 (테이블에 행을 삽입 할 때 자동으로 생성 됨)에 대해 다음으로 사용할 수있는 ID를 얻는 방법은 없으므로 삽입하지 않아도됩니다 그 행을 주어진 시간에 얻으려면?greenDao 자동 증분 ID를받습니다

정확하게 말하면 : 나는 목록보기를 포함하는 활동을 가지고 있으며, 각 항목은 두 번째 활동을 사용하여 추가됩니다. 두 번째 액티비티에서 아이템 세부 사항을 추가하는 작업을 마쳤을 때, 필자는 해당 아이템을 필사적 객체 (parcelable object)로 전달합니다. 나는 DaoGenerator가 생성 한 홀더 클래스 중 하나에 Parcelable Interface를 구현했습니다. 해당 객체의 id 값은 null 일 수 없으며 writeLong (id)과 함께 전달하고 Parcelable 메서드에서 readLong()을 사용하여받을 수 있으므로 이미 값을 삽입하여 id 값을 자동 생성해야합니다. 데이터베이스 내가하고 싶은 일은 (데이터베이스에 항목을 삽입하지 않고) 해당 ID를 생성하고 첫 번째 활동에 해당 항목을 전달하며 사용자가 목록에서 모든 항목을 저장하기로 결정하면 모든 항목을 데이터베이스에 추가합니다. 단일 거래로

Question questionHolder = new Question(
            null,          etItemContent.getText().toString()          .trim(),); 

          Log.d(LOG_TAG, "question id = " 
            + questionHolder.getId()); 

// inserting it here, would auto-generate the ID I required, 
// but I would like to do that to all of the items in the first Activity (containing the list of all of the items)         
// questionDao.insert(questionHolder); 

          Log.d(LOG_TAG, "question id = " 
            + questionHolder.getId()); 

          // add item to intent 
          Bundle b = new Bundle(); 
          b.putParcelable(IMPORTANCE_TAG, questionHolder); 

          Intent intent = new Intent(); 
          intent.putExtras(b); 

          setResult(RESULT_OK, intent); 
          QuestionItemActivity.this.finish(); 

답변

2

지나치게 단단한 커플 링을 생성하므로이 내용을 제안하지 않겠습니다. 내 마음에 오는 몇 가지 옵션 : 필드가 Null을 허용

  • 경우 해당 필드가 null인지 아닌지, 내가 나타 내기 위해 parcelable 다른 플래그를 추가 건의 할 것입니다. 그래서 DB ID를 1부터 시작하기 때문에,

    if(id == null) { 
        out.writeByte((byte)0); 
    } else { 
        out.writeByte((byte)1); 
        out.writeLong(id); 
    } 
    

    를 작성할 때와

    boolean hasId = in.readByte() == 1; 
    if(hasId) { 
        id = in.readLong(); 
    } 
    
  • 또 다른 옵션을 읽을 때, 당신은 0으로 ID를 설정하고 논리적으로이 문제를 처리합니다. 첫 번째 활동에서 객체를 받으면 ID를 확인하고 0이면 null로 설정할 수 있습니다.

+0

좋은 하나, 내가 Parcelable 플래그로 하나를 선택하고 괜찮아 보인다. 당신이 말하고자하는 것을 조금 설명해 주시겠습니까? "너무 꽉 끼는 커플 링을 만듭니다". – DoruAdryan

+0

. 두 가지 활동이 데이터베이스에 액세스하고 데이터베이스 상태가 변경되지 않는다고 가정합니다. 기본적으로 세 개의 개별 구성 요소가 동기화 된 상태로 작동한다고 가정합니다. (단단히 결합 됨) 기본 사례의 경우이 방법이 유용 할 수 있지만 나중에 데이터베이스에 작업을 추가하는 다른 방법이있을 수 있습니다. 자동 증가 카운터에 영향을줍니다. 이것은 알고리즘의 시간을 깨뜨릴 것이고 더러운 버그를 재현하기 어렵게 될 것입니다. 개체를 자체 포함시킴으로써 향후에 이러한 불쾌한 버그를 피할 수 있습니다. – yigit

+0

답변과 설명에 많은 감사를드립니다. – DoruAdryan

1

예 그렇게하는 평균있다 :

public class Question implements Parcelable { 

private Long id; 
private String questionContent; 

// KEEP FIELDS - put your custom fields here 
// KEEP FIELDS END 

public Question() { 
} 

public Question(Long id) { 
    this.id = id; 
} 

public Question(Long id,String questionContent) { 
    this.id = id; 
    this.questionContent = questionContent; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 


// KEEP METHODS - put your custom methods here 

// begin Parcelable implementation 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeLong(id); 
    dest.writeString(questionContent); 

} 

public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() { 
    public Question createFromParcel(Parcel in) { 
     return new Question(in); 
    } 

    public Question[] newArray(int size) { 
     return new Question[size]; 
    } 
}; 

private Question(Parcel in) { 

    id = in.readLong(); 
    questionContent = in.readString(); 
} 

// end Parcelable implementation 
// KEEP METHODS END 

}

를이 내가 만들고 목록에 항목을 보내는 방법은 다음과 같습니다

몇 가지 예제 코드 나는 기압이 ORM을 사용한다면! @ # %만큼 쉽습니다. 당신은 예를 들어, 할 일은 다음과 같습니다

  • 이 ID를 생성하는 시퀀스 이름을 가져옵니다 (수동으로 작성하지 않은 경우에도 하나가 항상있다).

  • 예를 들어 코드에서 SQL 쿼리를 만듭니다

    그것은 Session.createSQLQuery는 ("의 nextval ('mySequenceName'를 선택)");

  • 그런 다음 쿼리를 실행하여 고유 ID를 검색하십시오.

이 정보가 도움이되기를 바랍니다.

건배

+0

답변을 주셔서 감사합니다. 벨카 켐 (Belkacem) 님,하지만 이가의 솔루션은 더 쉽고 우아합니다. – DoruAdryan

+0

당신은 환영합니다 :) –