greenDao获取自动增量ID

时间:2013-06-24 16:54:41

标签: android greendao

对于我来说,获取表行的下一个可用ID(在表中插入行时会自动创建)是否有任何方法,因此我不会被迫在给定时间插入该行,得到它?

更确切地说:我有一个包含列表视图的活动,并且每个项目都是使用第二个活动添加的。当我在第二个活动中添加项目详细信息时,我将该项目传递给一个可分割的对象(我将Parcelable Interface实现为DaoGenerator创建的持有者类之一)。该对象的id值不能为null,用writeLong(id)传递它,并在我的Parcelable方法中用readLong()接收它,所以我必须通过插入当前项目来自动生成id值数据库。 我想要做的是:生成这些ID(不在数据库中插入项目),将该项目传递给第一个活动,当用户决定从列表中保存所有这些项目时,我会将所有这些项目添加到数据库中单笔交易。

我有一些示例代码:

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

}

这就是我创建项目并将其发送到列表的方式:

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 个答案:

答案 0 :(得分:2)

我不建议这样做,因为它创造了太多的紧耦合。 我想到了几个选项:

  • 如果某个字段可以为空,我建议在parcelable中添加另一个标志,以表示该字段是否为空。 所以写作时

    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();
    }
    
  • 另一种选择,因为db ids从1开始,你可以将id设置为0并在逻辑上处理它。所以当你在第一个活动中收到对象时,可以检查id,如果为0则设置为null。

答案 1 :(得分:1)

是的,这样做是有意义的,如果你使用的是ORM,这很简单!@#%。 例如,您所要做的就是:

  • 获取生成ID的序列名称(即使您没有手动创建ID,也始终有一个)。

  • 在代码中创建一个SQL查询,例如:

    session.createSQLQuery(“SELECT nextval('mySequenceName')”);

  • 然后执行查询以检索唯一ID。

我希望这会有所帮助。

干杯