Bài tập 31: Cách sử dụng SQLite trong Android


Nếu bạn nào muốn rèn luyện thêm lập trình Java, lập trình Android, lập trình Webservice với tổng thời lượng học >80 giờ thì có thể đăng ký học theo các link sau:

1) Lập trình java trong 4 tuần – 19 giờ(chỉ dành cho những ai CHƯA BIẾT GÌ VỀ LẬP TRÌNH hoặc đã biết lơ mơ về Java, lý thuyết và các bài tập phong phú tạo nền tảng lập trình Android và các hướng khác liên quan tới Java):
https://kyna.vn/lap-trinh-java-trong-4-tuan/325931
2) Lập trình Android cơ bản (>24 giờ học) – toàn bộ kiến thức về Android cơ bản:
https://kyna.vn/lap-trinh-android-co-ban/325931
3) Lập trình Android nâng cao (23 giờ học) – toàn bộ kiến thức về Android nâng cao:
https://kyna.vn/lap-trinh-android-nang-cao/325931
4) Lập trình Webservice cho Di Động – 14 giờ (dành cho những ai ĐÃ BIẾT ANDROID), những ai chưa biết Android tuyệt đối không đăng ký, khóa học hướng dẫn tỉ mỉ từ A->Z để có thể xây dựng được một phần mềm hoàn chỉnh tương tác client-server:
https://kyna.vn/lap-trinh-webservice-cho-di-dong/325931

Bài tập này Tôi sẽ hướng dẫn các bạn cách sử dụng SQLite trong Android.

Thay vì lưu trữ bằng text file, XML hay SharePreference thì bạn cũng có thể lưu trữ thông tin bằng SQLite. SQLite đã được tích hợp sẵn trong Android SDK.

Trong bài này các bạn sẽ học các phần sau:

1) Cách tạo / xóa một cơ sở dữ liệu SQLite trong Android

2) Cách tạo / xóa bảng trong SQLite

3) Cách thêm/ sửa/ xóa dữ liệu trong bảng

4) Cách truy vấn dữ liệu trong bảng.

– Tất nhiên còn rất nhiều chức năng khác, nhưng theo Tôi các bạn chỉ cần làm tốt 4 phần này thì có thể viết ứng dụng Android có SQLite một cách chuyên nghiệp rồi.

– Theo Tôi thì các bạn nên sử dụng công cụ SQLite Administrator: http://download.orbmu2k.de/files/sqliteadmin.zip để tạo hoàn chỉnh 1 CSDL sau đó kéo thả tập tin đó vào DDMS cho lẹ (cái này bạn tải về và tự tạo, rồi kéo thả vào DDMS). Còn các hướng dẫn dưới này Tôi muốn giúp các bạn hiểu được sâu xa bên trong (hướng programmer) CSDL SQLite.

– Giả sử các bạn cần tạo CSDL như mô tả dưới đây (qlquanlysinhvien.db):

– Bảng Lớp học (tbllop):

tbllop 
Tên cột Kiểu dữ liệu Mô tả
malop TEXT Khóa chính
tenlop TEXT
siso INTEGER

– Bảng sinh viên (tblsinhvien):

tblsinhvien
Tên cột Kiểu dữ liệu Mô tả
masv TEXT Khóa chính
tensv TEXT
malop TEXT khóa ngoại

– Để sử dụng SQLite, bạn import thư viện sau:

import android.database.sqlite.SQLiteDatabase;

———————————————————————————————————————-

1) Cách tạo / xóa một cơ sở dữ liệu SQLite trong Android:

– Tạo mới 1 CSDL:

31_sqlite_0

Khi lưu thành công, nó sẽ lưu CSDL vào:

/data/data/app/databases/

cụ thể:

31_sqlite_1

– Nếu bạn muốn lưu trữ trên SD Card thì bắt buộc bạn phải cấp quyền giống như đã đề cập tới ở những bài trước:

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

– Bạn chỉ việc lấy đường dẫn của SD Card ra rồi lưu tên CSDL vào đúng đường dẫn SD Card là ok. (Bạn tự xem lại các bài tập trước mà Tôi đã hướng dẫn cách làm).

– Xóa 1 CSDL:

31_sqlite_2

– Như trên thì ta chỉ cần gọi lệnh deleteDatabase(tên CSDL). Nếu xóa thành công thì trả về true, xóa thất bại trả về false;

2) Cách tạo / xóa bảng trong SQLite:

– Ở đây các bạn sẽ tạo 2 bảng tbllop tblsinhvien. Chú ý là chúng có mối ràng buộc toàn vẹn.

– Bạn xem cách tạo bảng lớp:

31_sqlite_3

– Bạn chú ý là tên đối tượng database (chỗ database.execSQL(sql)) là đối tượng SQLiteDatabase được tạo ra ở bước tạo CSDL. Bạn phải khai báo cho  phù hợp để ở trong hàm này cũng có thể truy suất.

– Tạo bảng sinh viên:

31_sqlite_4

– Vì bảng sinh viên có chứa khóa ngoại để tham chiếu tới bảng lớp, nên bạn phải chú ý dòng lệnh tham chiếu ở trên.

3) Cách thêm/ sửa/ xóa dữ liệu trong bảng:

– Cách thêm một dòng dữ liệu vào trong bảng:

+ Dùng đối tượng ContentValues để đưa dữ liệu vào bảng. Đối tượng này có các phương thức put (tên cột , dữ liệu)

+ Sau đó gọi phương thức insert để đưa đối tượng (dòng này) vào bảng.

+ Bạn chú ý là phương thức insert có rất nhiều loại đối số khác nhau, nhưng ở đây Tôi chỉ nói 1 loại đơn giản nhất (các kiểu khác bạn tự tìm hiểu thêm). Loại mà Tôi muốn đề cập tới đó là không liên quan gì tới kiểm tra các điều kiện, chỉ cần đưa đối tượng ContentValues vào insert là bạn sẽ có được 1 dòng mới:

31_sqlite_5

– Nhìn vào đoạn code ở trên, bạn thấy đó Tôi sử dụng cả 3 cột maloptenlopsiso của bảng lớp học:

values.put(“malop“,”DHTH7C”) ; tức là đưa giá trị “DHTH7C” vào cột malop.

– dòng lệnh database.insert(“tbllop“,null,values); Đối số 1 là tên bảng, đối số 2 bạn truyền null, đối số 3 bạn truyền đối tượng values

– Nếu thêm thành công thì sẽ trả về giá trị khác -1. Nếu bằng -1 là thất bại.

– Cách cập nhật dữ liệu:

– Ta dùng hàm update để cập nhật dữ liệu theo một điều kiện bất kỳ nào đó.

public int update (String table, ContentValues values,    String whereClause, String[] whereArgs)

– Đối số 1 là tên bảng

– Đối số 2 là đối tượng muốn chính sửa (với giá trị mới)

– Đối số 3 là tập các điều kiện lọc (dùng dấu chấm hỏi ? để tạo điều kiện lọc)

– Đối số 4 là tập các giá trị của điều kiện lọc (lấy theo đúng thứ tự)

– Hàm này trả về số dòng bị ảnh hưởng. Ví dụ nếu có 3 dòng bị thay đổi thì nó trả về 3. nếu không có dòng nào bị ảnh hưởng thì nó trả về 0.

Ví dụ: Tôi viết hàm chỉnh  sửa (bạn cũng nên tách thành từng hàm giống vậy):

31_sqlite_6

– Hàm trên : Đối số 1 là mã nào muốn được chỉnh sửa . Đối số 2 là giá trị mới. Cụ thể bảng lớp của chúng ta có 3 cột: mã lớp, tên lớp và sĩ số, nhưng mà Tôi chỉ muốn chỉnh sửa Tên lớp mà thôi. Do đó bạn thấy như vậy (ở đây Tôi chủ ý viết khuyết như vậy để các bạn hiểu rằng không nhất thiết phải sử dụng hết các cột).

– Xóa dữ liệu:

– Ta dùng hàm delete để xóa:

public int delete (String table,       String whereClause,       String[] whereArgs) 

– Đối số 1 là tên bảng

– Đối số 2 là tập điều kiện lọc (dùng ? để tạo)

– Đối số 3 là tập các giá trị của điều kiện lọc

– Hàm trả về số dòng bị ảnh hưởng.

– Muốn xóa toàn bộ dữ liệu trong bảng thì ta truyền null vào 2 đối số cuối:

31_sqlite_7

– Muốn xóa theo 1 mã nào đó:

31_sqlite_8

4) Cách truy vấn dữ liệu trong bảng.

– Là thao tác phức tạp nhất trong truy suất SQLite

– Ta dùng Cursor để lưu trữ giá trị trả về của hàm dưới đây:

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 

Xem bảng mô tả chi tiết:

table The table name to compile the query against.
columns A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn’t going to be used.
selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.
selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.
groupBy A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped.
having A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used.
orderBy How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.

– Ở đây Tôi làm ví dụ đơn giản nhất là truy vấn không phải lọc theo điều kiện nào cả:

– Ví dụ đọc tất cả danh sách lớp học trong bảng tbllop:

31_sqlite_9

-database.query sẽ trả về một Cursor, Lúc này Cursor đầu đọc chưa trỏ tới dòng dữ liệu nào cả. Do đó ta phải gọi lệnh .moveToFirst để Cursor trỏ đầu đọc tới dòng đầu tiên. Sau đó ta dùng vòng lặp while để duyệt từng dòng dữ liệu. Chú ý là Cursor này giống như Pointer nó cho phép truy suất ngẫu nhiên.

– Bạn có thể tải coding mẫu đầy đủ của phần hướng dẫn này ở đây: http://www.mediafire.com/download/leuuld4a225tw5c/LearnSQLite.rar

– Bài tập tiếp theo Tôi sẽ yêu cầu các bạn viết chương trình quản lý sách sử dụng SQLite để bạn củng cố thêm kiến thức về nó.

– Chúc các bạn thành công.

31 responses

  1. a ơi cho em hỏi sử dụng Administrator thì mình tạo trên đó như thế nào, với làm sao để đưa cơ sở dữ liệ mình vừa tạo trên Administrator trên app của mình vậy a

  2. Thưa thầy, em muốn lưu ảnh và gọi lại khi cần trong SQLite thì em phải làm ntn ạ. Thầy có thể giải thích giúp em được không.

    1. Để làm được điều này bạn lên tạo 1 table dùng để chứa đường link của ảnh. Rồi trong code bạn get đường link đó ra và gán vào control cần hiển thị ảnh là được thôi.
      Ví dụ table có cấu trúc dạng: Images(id, url, description)

      Trong đó: Images: là tên của table; url: là field dùng để lưu đường dẫn file ảnh; description: là chú thích cho file ảnh; id: là chỉ số dùng để định danh cho record.

  3. Theo Tôi thì các bạn nên sử dụng công cụ SQLite Administrator: http://download.orbmu2k.de/files/sqliteadmin.zip để tạo hoàn chỉnh 1 CSDL sau đó kéo thả tập tin đó vào DDMS cho lẹ (cái này bạn tải về và tự tạo, rồi kéo thả vào DDMS).Deo co huong dan gi cai nay, le cl j

    1. Dau dat. eo doc nhung bai truoc ah.

    2. mày nguy hiểm vl

    3. Tôi dùng cách của thầy để tạo bảng thôi, rồi tôi dùng SQL Manager chèn dữ liệu defaul vào, rồi sửa lại code file DB.java cho nó copy dữ liệu ra SmartPhone

  4. bạn ơi bạn có thể nói rõ hơn về cách sử dụng sqliteadmin được k?

    1. bạn có thể xem hướng dẫn trên youtube có rất nhiều.
      Link: https://www.youtube.com/watch?v=lnRRqCvNdD8&hd=1

  5. mình muốn sử dụng SQLLite theo mô hình 3 lớp, không biết bạn có thể hướng dẫn ko?

  6. Thầy có thể hướng dẫn cụ thể bằng hình ảnh cách kéo thả không ạ, hoặc chỉ em bài nào có hướng dẫn cái đó.

    http://download.orbmu2k.de/files/sqliteadmin.zip để tạo hoàn chỉnh 1 CSDL sau đó kéo thả tập tin đó vào DDMS cho lẹ (cái này bạn tải về và tự tạo, rồi kéo thả vào DDMS)

    1. Mình thấy dùng SQLite Manager tích hợp của firefox để tạo sẵn CSDL cũng dễ. Bạn có thể tham khảo tại link: https://www.youtube.com/watch?v=FnkruOCecd4

      1. Bạn có thể giúp mình sửa lỗi phông chữ khi nhập csdl bằng sql admin được ko?

  7. Thầy với mọi người cho em hỏi khi thực hiện xong hàm doCreateDb() thì cái thư mục data của em trông rỗng như lúc đầu, nó không có gì bên trong cả là tại sao ạ?

  8. híc bài nào của thầy cũng hay qá. e cảm ơn thầy nhìu lắm

    1. bạn có biết cách sửa lỗi phông khi nhập csdl bằng sql admin được ko giúp mình vs?

  9. @nguyenvanquan7826 bạn vô Showview->others->file explorer tìm sẽ thấy bạn

    1. bạn có biết cách sửa lỗi phông khi nhập csdl bằng sql admin ko giúp mình vs?

  10. thầy cho em hỏi, khi thả csdl được tạo bởi sqlite admin vào thì làm sao để thao tác được với nó trong bài.

  11. em chao thầy. thầy có thể hướng dẫn e cách nhập csdl cho sql bằng tiếng việt được không ạ? em nhập csdl bằng tiếng việt bị lỗi phông ạ. Tks thầy.

  12. thầy co thê lam một bai luu hình vao sqlite được không ạ, cảm ơn thầy rát nhiều

  13. anh ơi, cho em hỏi, tại trong CSDL nếu ad DATE vào, nó tự đổi kiểu là yyyy/mm/dd chứ không theo kiểu việt nam, em phải làm sao ạ

  14. cảm ơn thầy bài viết rất hay và hưu ịch ạ.

  15. Thầy cho e hỏi, muốn xuất dữ liệu một bảng theo id cho trước thì đk lọc thế nào ? Cảm ơn thầy !

  16. – Xóa 1 CSDL:

    – Như trên thì ta chỉ cần gọi lệnh deleteDatabase(tên CSDL). Nếu xóa thành công thì trả về true, xóa thất bại trả về false;

    cho em hỏi là lệnh deleteDatabase đó ở đâu ạ? em không hiểu khúc này.

  17. Hỏi cách import 1 database được tạo bởi SQLite Administrator vào Android Studio

    Ví dụ em có 1 databse có sẵn là testDatabase.s3db và bây giờ em muốn import nó vào Android Studio để sử dụng cho ứng dụng của mình thì làm như thế nào. Thầy và các bạn giúp em với.

  18. Cảm ơn anh.

  19. Em không giỏi SQL lắm
    Thầy ơi cho em hỏi là ON DELETE CASCADE nghĩa là gì ???

  20. […] Bài tập 31: Cách sử dụng SQLite trong Android […]

Leave a reply to nguyenvanquan7826 Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.