2010-08-27 3 views
2

У меня есть 2 стола: Contacts и Users.Удалить записи из переписанных таблиц

Contacts таблица содержит user_id, которые относятся к id в таблице Users. Contacts также содержат list_type.

Contacts: user_id, list_type Users: id, data

Как я могу удалить записи/строки из обеих таблиц (Contacts и Users), которые со ссылкой на данные list_type?

Фокус в том, что я не хочу удалять users, кто принадлежит к другим контактам list_type.

EDIT:

Пример:

Users (id,data) 
1 John 
2 Kate 
3 Alan 
4 Bob 

Contacts (user_id, list_type) 
1 1 
3 1 
1 2 
4 2 
2 2 

Теперь я хотел бы удалить list_type = 2, то результат должен быть:

Users (id,data) 
1 John - still is here, because it was also referring to list_type = 1 
3 Alan 

Contacts (user_id, list_type) 
1 1 
3 1 

ответ

1

от того, что я понял, я могу дать вам этот ответ .. Я думаю, что таблица пользователей имеет поле user_id .. Я дал это примерно, вы делаете это удобным для своего кода ..: D

select user_ids from contacts where list_type=some_type; 

    while(resultSet.next()){ 
     String userid=restultSet.getString(1); 
     delete from users where user_ids=userid; 
    } 
    delete from contacts where list_type=some_type; 

EDIT:

resultSet_1 = select user_ids from contacts where list_type=some_type; 

while(resultSet_1.next()){ 
    String userid=resultSet_1.getString(1); 
    resultSet_2 = select count(user_ids) from contacts where user_id=userid group by user_ids; 
    int count=resultSet_2.getInt(1); 

    if(count==1){  //if more than 1 it means contact is in more than one list_type 
     delete from users where user_ids=userid; 
    } 
} 
delete from contacts where list_type=some_type; 
+0

thx для рабочего решения, принятое –

2

разбить его на два этапа;

SQLiteDatabase db; 
     Cursor c = db 
       .query("Contacts", new String[] { "user_id" }, "list_type=?", 
         new String[] { "list_type_1" }, null, null, null); 

     if(c.moveToFirst()){ 
      do{ 
       db.delete("Users", "user_id=?",new String[]{c.getString(c.getColumnIndex("user_id"))}); 
      }while(c.moveToNext())); 
     } 

     db.delete("Contacts", "list_type=?", new String[]{"list_type_1"}); 
+0

Посмотрите на EDIT, я думаю, я не добьюсь этого с этим ответом. Должен ли я использовать внешние ключи или что-то еще? –

+0

Использование внешних ключей заманчиво, но я бы посоветовал это, так как это сделало бы его неудобным как первичный ключ, а также в Users. – MPelletier

+0

+1 для кода Java –

1

У меня возникнет соблазн сделать это с помощью SQL. Я говорю, позвольте базе данных управлять и очищать себя. Меньше назад и вперед между базой данных и вашим приложением, более быстрым исполнением и меньшим количеством кода для поддержки.

После любого удаления из списка контактов, выполните следующий запрос: (! Что еще более громким)

DELETE FROM Users WHERE Id NOT IN (SELECT DISTINCT User_id FROM Contacts); 

Или вы можете создать триггер и добавить его к вашей схеме:

CREATE TRIGGER CleanUsers AFTER DELETE ON Contacts 
    BEGIN 
    DELETE FROM Users WHERE Id NOT IN (SELECT DISTINCT User_id FROM Contacts); 
    END; 
+0

+1 для чистого решения –

+0

@ darbat: Спасибо. Могу ли я спросить вас, что мотивировало ваш окончательный выбор? – MPelletier

Смежные вопросы