foreignAutoCreate插入我注意到,foreignAutoCreate崩潰時,相關數據已經存在,拋出這樣的事情:Ormlite:如果不存在
E/SQLiteLog﹕ (2067) abort at 20 in [INSERT INTO `Group` (... etc,`id`) VALUES (?,?,?)]:
UNIQUE constraint failed: Group.id
,但我有一個列表,例如:
List<User> lstUsers = //values
IM用createOrUpdate循環「for」插入值:
for(...) {
dao.createOrUpdate(user);
}
和User有關聯的數據與Gr OUP通過例如:
@DatabaseField(canBeNull = true, foreign = true, foreignAutoCreate = true,
foreignAutoRefresh = true)
private Group group;
當我有值的重複組ID的操作失敗:
lstUsers.get(0).getGroup().getId(); // group id = 1 <-- foreign insert
lstUsers.get(1).getGroup().getId(); // group id = 1 <-- crash
lstUsers.get(3).getGroup().getId(); // group id = 1 <-- crashed already
lstUsers.get(3).getGroup().getId(); // group id = 2 <-- crashed already
... etc.
我需要插入沒有reppeated的基團或基團與自動(插入僅1次) foreignAuto無法手動創建。
lstUsers.get(0).getGroup().getId(); // group id = 1 <-- foreign insert
lstUsers.get(1).getGroup().getId(); // group id = 1 <-- foreign exists, skip
lstUsers.get(3).getGroup().getId(); // group id = 1 <-- foreign exists, skip
lstUsers.get(3).getGroup().getId(); // group id = 2 <-- foreign insert
有一個辦法做到這一點?
更新1:
與這個測試嘗試請:
public void poblatingUsersAndGroupsList(){
List<User> lstUsers = new ArrayList<>();
Group group1 = new Group();
// this group doesn't exists in database
group1.setId(1); // should be inserted by ForeignAutoCreate
lstUsers.add(new User("user1",group1));
lstUsers.add(new User("user2",group1));
lstUsers.add(new User("user3",group1));
Group group2 = new Group();
group1.setId(2);
// this group doesn't exists in database
group1.setId(1); // should be inserted by ForeignAutoCreate
lstUsers.add(new User("user4",group1));
lstUsers.add(new User("user5",group2));
lstUsers.add(new User("user6",group2));
createUsersInGroup(lstUsers);
}
public void createUsers(List<User> lstUsers){
for(User user : lstUsers){
// here is the error
// group1 inserted the 1st time
// the 2nd, 3rd, n times are throwing error
// same for group2
dao.createOrUpdate(user);
}
}
foreignAutoCreate應該像這樣的代碼,所以我們能夠避免的代碼塊:
public void createUsers(List<User> lstUsers){
for(User user : lstUsers){
// (innecesary) calling or instantiating the groupDao
// (innecesary) check if not exists
groupDao.createIfNotExists(user.getGroup());
dao.createOrUpdate(user);
}
}
當你說「崩潰」時,你的意思是引發異常嗎?你能提供你得到的例外嗎? – Gray
E/SQLiteLog:(2067)在中止在20 INSERT INTO'Group'(...等,'id')VALUES(,,???)]: UNIQUE約束失敗:Group.id –
這是一個老問題,我假設你繼續前進。然而,我無法重現這一點,我已經添加了測試來覆蓋它。請參閱:https://github.com/j256/ormlite-core/commit/9f34c7371c580ba0d138176265490df904702fcf – Gray