2015-08-24 22 views
0

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); 
    } 
} 
+0

當你說「崩潰」時,你的意思是引發異常嗎?你能提供你得到的例外嗎? – Gray

+0

E/SQLiteLog:(2067)在中止在20 INSERT INTO'Group'(...等,'id')VALUES(,,???)]: UNIQUE約束失敗:Group.id –

+1

這是一個老問題,我假設你繼續前進。然而,我無法重現這一點,我已經添加了測試來覆蓋它。請參閱:https://github.com/j256/ormlite-core/commit/9f34c7371c580ba0d138176265490df904702fcf – Gray

回答

0

這是一個老問題,我假設你繼續前進。然而,我無法重現這一點。我已經使用dao.createOrUpdate(...)擴展了多個插入測試用例。請參閱ForeignObjectTest unit test code。我想知道

的一件事是,當你與assocaited Group創建User,該Group必須已創建,以便它有一個id。這可能是問題嗎?

Group group = new Group(); 
// need to do this first to have group get an id 
groupDao.create(group); 
User user = new User(); 
user.setGroup(group); 
for(...) { 
    dao.createOrUpdate(user); 
} 
+0

也許我的壞,什麼是「foreignAutoCreate =真正的」 propperty註釋的含義是什麼?我的理解是自動創建外部,但如果有其他含義請告訴我,我不是專家。但我認爲foreigntAutoCreate可以或應該處理創建外部並檢查是否存在更新或跳過創建。爲了跳過**,需要先做這件事,讓團隊獲得一個ID **並獲得一個清潔代碼,只是建議。 –

+0

當foreignAutoCreate在這種情況下創建第一個「Group」時,它將獲得插入的「Group」ID,因此下一個ForeignAutoCreate應檢查鏈接的「Group」外地字段,並執行一些操作,idk,跳過或更新「Group」用戶。 –

+0

我編輯了我的問題,添加了更清晰的測試用例。 –