对于我来说,获取表行的下一个可用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();
答案 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。
我希望这会有所帮助。
干杯