2014-10-10 15 views
5

Tôi đang sử dụng ormlite trong android và đã tạo bảng thành công và thực hiện các thao tác khác nhau bằng DAO.Cách thực hiện xóa thác trên khóa ngoài bằng cách sử dụng ormlite trong android

Nhưng tôi đã bị kẹt trong việc xóa hàng phím ngoài nếu khóa chính bị xóa khỏi bảng chính.

Tôi có hai bảng có tên là Cha mẹ và con. Một phụ huynh có nhiều hơn một đứa con nên tôi liên kết đứa trẻ với khóa ngoại.

Code:
bảng phụ huynh:

@DatabaseField(id = true) 
private Integer id; 

@ForeignCollectionField(eager = false) 
private ForeignCollection<Child> childCollection; 

Child Bảng:

@DatabaseField(id = true) 
private Integer id; 

@DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = false, 
    index = true, columnDefinition = "INTEGER REFERENCES parent(id) ON DELETE CASCADE") 
private Parent parent; 

Bây giờ Nếu tôi xóa hàng mẹ cho một id đặc biệt thì đây không xóa các trẻ em từ bảng con.

public void deleteById(Integer parentId) { 
    try { 
     Dao<Parent, Integer> parentDao = databaseHelper.getParentDao(); 
     parentDao .deleteById(parentId); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

Vui lòng hướng dẫn tôi, nơi tôi đang làm sai. Tôi đã thử và Google nhiều lần nhưng không may mắn.

Trả lời

2

Có thể bạn đã tìm thấy giải pháp, nhưng ai đó có thể cần điều này. theo BaseForeignCollection mã nguồn là giải pháp có thể được như sau:

parent.getChildren().clear(); 
Dao<Parent, Integer> parentDao = databaseHelper.getParentDao(); 
parentDao.delete(parent); 

Trên thực tế, bạn có thể thực hiện dao của riêng bạn cho phụ huynh và ghi đè phương pháp xóa như thế này:

@Override 
public int delete(final Parent data) throws SQLException { 
    data.getChildren().clear(); 
    return super.delete(data); 
} 

Có lẽ, sẽ là đủ trong ví dụ các trường hợp.

1

Bạn nên sử dụng constraint, như:

@DatabaseField ( 
    foreign = true, 
    foreignAutoRefresh = true, 
    canBeNull = false, 
    index = true, 
    columnDefinition = "INTEGER CONSTRAINT FK_NAME REFERENCES parent(id) ON DELETE CASCADE" 
) 
private Parent parent; 

T.B. Tôi biết đó là bài viết cũ chết 3 năm :)

+0

StackOverflow không phải là diễn đàn, câu trả lời mới được chào đón :) – m0skit0

Các vấn đề liên quan