я заметил, что foreignAutoCreate аварии, когда соответствующие данные уже существует, бросая что-то вроде этого:Ormlite: foreignAutoCreate вставить, если не существует
E/SQLiteLog﹕ (2067) abort at 20 in [INSERT INTO `Group` (... etc,`id`) VALUES (?,?,?)]:
UNIQUE constraint failed: Group.id
, но у меня есть список, пример:
List<User> lstUsers = //values
-им вставки значения с петлей «для» с createOrUpdate:
for(...) {
dao.createOrUpdate(user);
}
и Пользователь связанные данные с Gr ОУП пример:
@DatabaseField(canBeNull = true, foreign = true, foreignAutoCreate = true,
foreignAutoRefresh = true)
private Group group;
Когда я есть значение идентификатора повторного группы сбоя операции:
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 (вставить только один раз) автоматически foreignAutoCreate нет вручную.
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
есть способ сделать это ??
UPDATE 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 (?,?,?)]: УНИКАЛЬНОЕ ограничение не выполнено: Group.id –
Это старый вопрос, и я предполагаю, что ты перешел. Однако я не смог воспроизвести это, и я добавил тесты для его покрытия. См.: Https://github.com/j256/ormlite-core/commit/9f34c7371c580ba0d138176265490df904702fcf – Gray