2015-08-24 3 views
0

я заметил, что 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); 
    } 
} 
+0

Когда вы говорите «сбой», что вы имеете в виду, это исключает право на исключение? Можете ли вы предоставить исключение, которое вы получаете? – Gray

+0

E/SQLiteLog: (2067) отменить в 20 в [INSERT INTO 'Group' (... и т. Д.,' Id') VALUES (?,?,?)]: УНИКАЛЬНОЕ ограничение не выполнено: Group.id –

+1

Это старый вопрос, и я предполагаю, что ты перешел. Однако я не смог воспроизвести это, и я добавил тесты для его покрытия. См.: Https://github.com/j256/ormlite-core/commit/9f34c7371c580ba0d138176265490df904702fcf – Gray

ответ

0

Это это старый вопрос, и я предполагаю, что вы двинулись дальше. Однако я не смог воспроизвести это. Я расширил тестовые примеры несколькими вставками, используя dao.createOrUpdate(...). См. ForeignObjectTest unit test code.

Единственное, что мне интересно, о том, что когда вы создаете User с assocaited Group, то 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 = true» аннотации propperty? я понимаю, что Create Foreign автоматически, но если есть другой смысл, скажите мне, я не эксперт.но я думал, что foreigntAutoCreate может или должен обрабатывать создание чужих и проверять, существует ли для его обновления или пропустить создание. для того, чтобы пропустить **, нужно сделать это сначала, чтобы группа получила идентификатор ** и получила код ключа, просто предлагая. –

+0

, когда foreignAutoCreate создает первую «группу» в этом случае, он получает вставленный идентификатор «Group», поэтому следующий foreignAutoCreate должен проверять связанное «чужое» поле «Group» и делать что-то, idk, пропускать или обновлять «Group», с разными Пользователь. –

+0

Я отредактировал мой вопрос, добавив тестовый пример более ясно. –