30/09/2018, 20:25
Cách nối bảng sqlite trong Android?
Mọi người cho em hỏi chút. VD e có 2 bảng là học sinh gồm các cột: id_hs , ten_hs , tuoi và bảng lớp gồm các cột : id_lop , ten_lop . Em muốn nối 2 bảng thành 1 bảng vs các cột id_hs , ten_hs , ten_lop để hiển thị. Vậy lúc em truy vấn để lấyy kết quả 3 cột thì lấy làm sao ạ? Vì nếu e lấy học sinh thì lại không có thuộc tính ten_lop nên không thể get đc…
Bài liên quan
Bảng học sinh phải có thuộc tính id_lop nữa chứ, không thì làm sao biết được học sinh này thuộc lớp nào.
Giả sử có bảng hocsinh
và bảng lop
Muốn lấy được id_hs, ten_hs, ten_lop, bạn sử dụng lệnh inner join để nối 2 bảng tạo 1 bảng virtual (bảng tạm)
nó sẽ ra
giờ muốn filter thì dùng WHERE
Cái cột tên lớp ấy thì mình lấy dữ liệu làm sao ạ? vì nếu lấy đối tượng là học sinh thì sẽ không có thuộc tính là tên lớp
Thế thì nó phải có 1 bảng nữa, nối 2 bảng này với nhau ^^
Kiểu vậy, giờ là join cả 3 bảng với nhau để tạo 1 virtual table ^^
không phải đâu ạ. Anh nối 2 bảng như lúc đầu là giống vs cái bảng em đang làm rồi nhưng em ko biết truy vấn ra tên lớp thì mình phải dùng kiểu gì ấy ạ?
Không hiểu ý của bạn lắm vì rõ ràng kết quả có tên lớp rồi mà.
Hay ý bạn là filter theo tên lớp
… thêm vào WHERE ten_lop = ‘KHMT’
Hay ý bạn là do đã bind vào ORM, mà entity Hocsinh thì không có tên lớp
Hocsinh
+id_hocsinh
+ten
+tuoi
và
Lop
+id_lop
+ten
Có rất nhiều cách thiết kế ORM trong trường hợp này:
+Giả lập RDBMS: thêm id_lop vào class HocSinh
+Thêm thuộc tính Lop vào class HocSinh (nhúng class lớn vào bé, ở đây quan hệ là has-a, 1-n)
+Thêm thuộc tính HocSinh[] là mảng các học sinh vào class Lop.
+Thêm thuộc tính hocsinh_id[] là mảng các học sinh id vào class Lop.
Hay quá nhỉ. Thế mà e lại không nghĩ ra là cách thêm thuộc tính Lớp vào class Học Sinh. Em chỉ nghĩ ra là thêm thuộc tính tên lớp vào class Học Sịnh. Như thế cũng đc nhưng giả sử mình có nhiều cột mà Học Sinh không có thì khi thêm như vậy cũng không phải là cách hay…
À anh cho em hỏi thêm với. Khi mình tạo dc cái bảng nối như kia r thì làm sao mà khi mình thay đổi mã hs của bảng học sinh thì bảng nối sẽ tự động thay đổi theo ?
À, thêm tên lớp cũng là 1 cách làm rất hay mà (gọi là Decorator: khi nào cần thêm thuộc tính nào thì mình decorate thêm, ví dụ như tên_lớp).
Cái này chắc bạn làm với Android sử dụng SQLiteOpenHelper ah?
Còn cái virtual table là được tạo dynamic bạn ah. Nên bạn thay đổi id_hocsinh thì hiển nhiên, output ra cũng sẽ thay đổi. Chứ nó không phải cached table (một số CSDL như postgre cho phép giữ lại cache table)
Em mới học nên đặt câu hỏi chưa đc rõ ràng lắm. Anh thông cảm nhá Trong bảng học sinh có id_lop, vậy lúc em thay đổi id_lop ở bảng Lớp thì làm sao mà bảng học sinh đấy cũng thay đổi theo đc vậy ạ???
ID chỉ để làm reference, việc gì mà phải thay đổi hả bạn?
Còn nếu bạn muốn các thay đổi này thì các CSDL đều cho thiết lập “data integrity” (toàn vẹn dữ liệu). Ví dụ nếu bạn xóa 1 lớp hay thay đổi id của lop, thì trong bảng hocsinh, các reference này gọi là orphan (mồ côi). Để tránh mồ côi, bạn khai báo foreign key, ví dụ bảng hocsinh có foreignkey là id_lop, thiết lập
OnDelete
OnUpdate
theo các rule như
Restrict: cấm không được đổi
NoAction: không làm gì
Cascade: thay đổi theo tương ứng (cái này đúng yêu cầu này)
SetNull: trỏ về null
Khi lập trình nên thiết lập data integrity mặc dù mình sẽ phải validate rất nhiều, nhưng nó sẽ giống như lớp bảo vệ cuối cùng giúp data trở nên đúng đắn và app sẽ không bị lỗi vặt. Còn nếu không set, app sau này sẽ có rất nhiều orphan và bạn sẽ phải sửa code để làm việc với các dữ liệu không chuẩn ^^
Nhưng nếu em cho bảng học sinh có cột A không phải là khóa chính, bảng Lớp cũng có cột A. Vậy thì mình không thể dùng khóa ngoại đc. Như thế thì e phải làm sao để bảng học sinh vẫn tự động cập nhật đc thông tin khi mình thay edit cột A từ bảng Lớp? Nếu được thì a cho e xin code luôn nhé…