Lưu trữ dữ liệu với SQLite | How Kteam

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về CÁCH LƯU TRỮ DỮ LIỆU ĐƠN GIẢN DẠNG KEY – VALUE. Cách này phù hợp khi cần lưu dữ liệu nhỏ, ví dụ như thông tin đăng nhập, cookie, hoặc một số tinh chỉnh trong ứng dụng.

Tuy nhiên với những ứng dụng cần sử dụng khối lượng tài liệu lớn hơn, tất cả chúng ta sẽ cần cách tàng trữ khác. Và đặc biệt quan trọng là với dạng tài liệu có cấu trúc, cần truy vấn sau này theo dạng truy vấn thì không gì thích hợp hơn cơ sở tài liệu ( Database ) .

Thật ngon lành là Android (và cả iOS) có hỗ trợ SQLite – một hệ cơ sở dữ liệu nguồn mở. Bài học này chúng ta sẽ cùng tìm hiểu về nó.

Nội dung

Để đọc hiểu bài này tốt nhất những bạn nên có kiến thức và kỹ năng cơ bản về những phần :

  • CẤU TRÚC CƠ BẢN MỘT CHƯƠNG TRÌNH ANDROID.
  • Biết viết một số câu lệnh SQLite cơ bản (SELECT * FROM… chẳng hạn).

Trong bài học kinh nghiệm này, tất cả chúng ta sẽ cùng khám phá những yếu tố :

  • SQLite là gì.
  • Những kiểu dữ liệu được hỗ trợ trong SQLite.
  • Viết một ứng dụng nhỏ để thêm / xoá tên trong SQLite.

SQLite là…

  • Một hệ cơ sở dữ liệu nguồn mở.
  • Hỗ trợ cú pháp y như SQL.
  • Là dạng cơ sở dữ liệu quan hệ (standard relational database).
  • Được tích hợp vào mọi thiết bị Android, không cần cài đặt và tiến hành cấu hình quản trị.
  • Bạn chỉ cần viết câu lệnh tạo bảng và cập nhật bảng, còn lại việc quản lý Android sẽ do hệ điều hành phụ trách.

SQLite hỗ trợ các kiểu dữ liệu

  • TEXT(văn bản thường).
  • INTEGER(số nguyên, nhưng tương đương với kiểu Long trong Java).
  • REAL(số thực, tương đương với Double trong Java).

Ngoài ra SQLite cũng có thể lưu được cả hình ảnh nếu chuyển đổi dữ liệu sang dạng Base64. Lưu ý là với cách này thì dung lượng dữ liệu sẽ bị dội lên.

Tất cả những loại tài liệu khác đều phải quy đổi sang 3 dạng trên để hoàn toàn có thể chèn vào trong bảng của SQLite. Tuy nhiên SQLite không kiểm tra tài liệu. Tức là bạn hoàn toàn có thể chèn tài liệu TEXT vào column tài liệu dạng INTEGER .
Việc truy vấn vào SQLite sẽ dẫn đến truy vấn vào file mạng lưới hệ thống. Do đó thời hạn thực thi sẽ lâu hơn so với những thao tác khác. Cũng do đó mà việc truy vấn SQLite khuyến nghị nên thực thi bất đồng bộ ( Asynchronous ) .
Nếu như ứng dụng của bạn tạo ra bảng, mặc định nó sẽ nằm ở :

DATA/data/TÊN_APP/databases/TÊN_FILE.DB

Thật ra đường dẫn trên được cấu thành từ những pháp luật sau :

  • DATA: Đường dẫn này được tạo nên từ kết quả trả về của hàm Environment. getDataDirectory ( )
  • TÊN_APP: Tên ứng dụng.
  • TÊN_FILE: Tên của bảng, lúc tạo bảng bạn đặt thế nào thì nó ra thế này.

Kiến trúc của SQLite

Package

Package android.database phân phối tổng thể những lớp sử dụng để thao tác với cơ sở tài liệu .
Package android.database.sqlite cung ứng những lớp thao tác với SQLite nói riêng .

Tạo và upgrade cơ sở dữ liệu với SQLiteOpenHelper

Để tạo và upgrade cơ sở dữ liệu trong ứng dụng Android, các bạn cần kế thừa từ lớp SQLiteOpenHelper, gọi ra hàm super() để lấy các method cần thiết từ lớp cha, sau đó chỉ định tên database và phiên bản database.

Trong lớp đã tạo tất cả chúng ta phải override 2 hàm sau :

  • onCreate ( ) : Gọi khi database được truy cập, nhưng chưa được tạo xong.
  • onUpgrade ( ) :Gọi ra khi phiên bản database được nâng lên. Chú ý là phiên bản database chỉ có tăng chứ không giảm.

Cả 2 phương pháp này đều nhận một đối tượng người dùng SQLiteDatabase làm tham số nguồn vào, cũng là đối tượng người dùng Java đại diện thay mặt cho cơ sở tài liệu .

Lớp SQLiteOpenHelper cung cấp 2 phương thức để lấy database:

  • getReadableDatabase ( ): Lấy ra database dạng chỉ đọc.
  • getWriteableDatabase ( ): Lấy ra database dạng ghi được.

Các bảng cơ sở tài liệu đều sử dụng một khóa chính là _id. Có nhiều thao tác cơ sở tài liệu chính được dựa trên cái khóa này .

Chú ý: Do _id là kiểu INTEGER trong bảng SQLite, mà kiểu này lại tương ứng với Long trong Java, các bạn chú ý khi sử dụng.

Một lời khuyên được đưa ra ở đây là mỗi Model nên tương ứng với 1 bảng, mỗi bảng có phương pháp onCreate và onUpgrade riêng, sau này sẽ dễ đọc hơn .

SQLiteDatabase

SQLiteDatabase là lớp cơ bản dùng để làm việc với SQLite trong Android, và nó cũng cung cấp phương thức để làm việc với database thông thường như sửa /xoá /mở /đóng database. Cụ thể là những phương thức sau:

  • insert ( )
  • update ( )
  • delete ( )

Thêm vào đó, nó cũng cung cấp phương thức execSQL, cho phép thực thi trực tiếp câu lệnh truy vấn SQL.

Dữ liệu trong bảng thường được tham chiếu dạng key-value, vậy thì nó được bộc lộ trong Java thế nào ?

Câu trả lời là ContentValues. “key” thể hiện đặc tính giá trị và “value” thể hiện giá trị tương ứng trong mỗi bản ghi.

– “ Dài dòng quá ” – một bạn lười đọc cho biết .
Vậy thì hiểu ngắn gọn : Nó dùng để chèn hoặc update bản ghi trong Database là đủ rồi .
Các câu truy vấn hoàn toàn có thể được thực thi qua 2 dạng, 2 dạng này đều trả về “ con trỏ ” ( cursor ), từ con trỏ này tất cả chúng ta mới lấy ra tài liệu thêm :

  • rawQuery ( ): Chấp nhận lệnh truy vấn SQL trực tiếp.
  • query ( ): Phương thức này thì… không hẳn là dễ hơn nhưng an toàn hơn, nó cung cấp giao diện (interface) để lập trình viên viết lệnh truy vấn thuần với Java hơn một chút.

Ngoài ra chúng ta còn có lớp SQLQueryBuilder, dùng để viết câu lệnh truy vấn SQL thuận tiện hơn nữa.

Ví dụ: rawQuery()

Cursor cursor = getReadableDatabase().

        rawQuery("select * from user where _id = ?", new String[] { id });

Câu lệnh trên sử dụng để chọn tổng thể những bản ghi trong bảng “ user ” .

Ví dụ: query()

Chúng ta có truy vấn bằng phương pháp query ( )

return database.query(DATABASE_TABLE,

        new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION },

        null, null, null, null, null);

Câu lệnh trên sẽ chọn toàn bộ những bản ghi chứa những cột có key là KEY_ROWID, KEY_CATEGORY, …
Bảng sau diễn đạt những tham số nguồn vào của phương pháp query ( )

Lưu trữ dữ liệu với SQLite

Một số lưu ý thêm:

Với query ( ) thì khi dùng tham số whereClause, tất cả chúng ta không cần thêm chữ “ WHERE ” vào. Ví dụ : Chỉ cần như thế này là đủ : “ _id = 69 and summary = ? ”

  • Nếu có giá trị tạm giữ (chỗ dấu

    ?

    ý) thì các bạn thêm chúng vào ở selectionArgs.

Mỗi truy vấn trên đều trả về Cursor. Cursor ở đây tức là con trỏ, nó đại diện thay mặt cho tập những giá trị đã truy vấn được, và bản thân nó sẽ “ trỏ ” vào một giá trị trong tập tài liệu trả về. Tức là sao ? Với cách này Android sẽ tiết kiệm ngân sách và chi phí được bộ nhớ, không cần phải giải quyết và xử lý ồ ạt cả đống tài liệu trả về nữa .

  • Để lấy tổng số dữ liệu trả về, ta dùng getCount ( ).
  • Để nhảy con trỏ tới tiếp theo hoặc trên cùng, ta dùng moveToNext ( )và moveToFirst ( ).
  • Để kiểm tra xem con trỏ đã trỏ đến kết quả cuối cùng chưa, ta dùng hàm isAfterLast ( ).
  • Cursor cung cấp các hàm get * ( ), ví dụ: getLong ( columnIndex ), getString ( columnIndex ), … trong đó columnIndex là số của cột mà bạn đang truy cập.

Kết luận

Qua bài này tất cả chúng ta đã nắm được SQLite là gì, những lớp thao tác với SQLite và những hàm truy vấn SQLite .

Bài sau, chúng ta sẽ làm một ứng dụng nhỏ để thêm và xoá danh sách trong SQLite, cũng như làm quen với KHÁI NIỆM ORM (Object Relational Mapping) 

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

Thảo luận

Nếu bạn có bất kể khó khăn vất vả hay vướng mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI và ĐÁP trên thư viện Howkteam. com để nhận được sự tương hỗ từ hội đồng .