Cơ sở dữ liệu trong Android phần 1

Tạo CSDL SQLite và kết nối trong Android

SQLite là một loại CSDL quan hệ, nhỏ gọn – (nguồn mở https://www.sqlite.org/about.html), như giới thiệu ở trang chủ SQLite, nó là hệ CSDL được sử dụng rất rộng rãi trên nhiều nền tảng (Mobile, Destop, Webserver …), nó có các ưu điểm có thể kế ra như: Là hệ CSDL SQL nhúng, sử dụng ngay mà không cần cấu hình, không cần có một Server SQL riêng (khác với MySQL, MS SQL Server …) …

Mỗi CSDL SQlite được lưu trữ thành một file trong strorage (xem thêm SQLite cơ bản), Android hỗ trợ tốt SQLite 3, trước tiên để ứng dụng hoạt động cần cho phép quyền truy cập đến storage để lưu / xoá file CSDL. Trong manifests của ứng dụng cần thêm quyền này vào.

Nơi lưu SQLite3 DB trong Android

Với Android mỗi ứng dụng được cách ly một vùng để lưu dữ liệu của riêng nó (vùng này không được truy cập bởi ứng dụng khác), các file dữ liệu được hoạch định nên lưu tại /data/data/applicationId/databases/

Trong đó applicationId là ID của ứng dụng thiết lập trong file build.gradle của ứng dụng. Ví dụ ứng dụng có ID là net.xuanthulab.sqlitetutorial thì nơi lưu CSDL sẽ là:

Đây là cấu trúc chuẩn, tuy nhiên bạn có thể lưu DB bất kỳ đâu miễn là ứng dụng có quyền truy cập đến thư mục đó.

Nếu không chắc chắn lưu trữ ở đâu thì từ đối tượng Context (Activity) có thể xác định vị trí lưu trữ của DB. Giả sử DB của bạn có tên là mydb.db, thì gọi phương thức sau sẽ có được đường dẫn đầy đủ:

Mở, tạo một SQLite DB

Thư viện Android cung cấp lớp cơ sở SQLiteDatabase (android.database.sqlite.SQLiteDatabase) để thực hiện các công việc tạo ra file CSDL, kết nối đến nó, truy vấn, cập nhật dữ liệu …, để có được một đối tượng lớp SQLiteDatabase có một số cách.

 Tạo hoặc mở một DB bằng phương thức tĩnh SQLiteDatabase.openOrCreateDatabase(path, factory)

Trong đó tham số path là đường dẫn ĐẦY ĐỦ đến file cơ sở dữ liệu sẽ kết nối (nếu file này chưa có sẽ tự động tạo ra), nhớ cần chỉ ra đường dẫn chính xác lưu tại vị trí mà ứng dụng có quyền truy cập. Ví dụ, ứng dụng ID là net.xuanthulab.sqlitetutorial, cần tạo db có tên file là mydb.db thì đường dẫn đầy đủ sẽ là "/data/data/net.xuanthulab.sqlitetutorial/databases/mydb.db"

Tham số factory là đối tượng SQLiteDatabase.CursorFactory, nó thi hành khi truy vấn đến DB, ta sẽ tìm hiểu sau. Bạn có thể thiết lập là null, đây là đoạn code để mở (tạo nếu chưa có) một CSDL có tên mydb.db

 Tạo hoặc mở một DB bằng phương thức tĩnh Context.openOrCreateDatabase(dbname, mode, factory)

Sử dụng cách này khi bạn đang trong một Activity hoặc có đối tượng Context, lúc này bạn chỉ việc chỉ ra tên DB (ví dụ mydb.db, phương thức sẽ định vị db tại cấu trúc đường dẫn trên), tham số mode có thể lấy là Context.MODE_PRIVATE, cách này khá thông dụng, ví dụ đoạn code sau trong một Activity.

Xoá một SQLite DB

Xoá một DB, đơn giản là xoá file khỏi storage, bạn có thể thực hiện bằng cách.

Thực hiện các truy vấn SQLite – Android

Sau khi kết nối, tạo được Database (có đối tượng SQLiteDatabase) thì để chạy các truy vấn (câu lệnh SQL – Đọc thêm SQL Cơ bản để biết cách viết các câu lệnh SQL) ta có thể dùng phương thức rawQuery

Thực hiện câu lệnh SQL

execSQL

Thực hiện các câu lệnh SQL mà không có tập dữ liệu trả về như:
Tạo bảng CREATE TABLE, xoá bảng DROP TABLE Persons,
Chèn dữ liệu vào bảng với INSERT INTO,
Xoá dòng dữ liệu với DELETE FROM,
Cập nhật các dòng dữ liệu với UPDATE
rawQuery
Để thực hiện các câu lệnh truy vấn có tập dữ liệu trả về như: Lấy dữ liệu với SELECT

Các câu lệnh SQL viết trên, nếu có cần truyền tham số thì các tham số được ký hiệu bằng ký tự ?, sau đó tham số truyền vào theo thứ tự trong mảng selectionArgs

Ví dụ làm việc với SQLite

Ví dụ này áp dụng các lệnh làm việc với SQLite ở trên, nó ở mức thấp, điều này đòi hỏi viết trực tiếp các truy vấn SQL nên cũng cần thành thao ngôn ngữ SQL.

Ta sẽ thực hiện lại ví dụ tại Dùng ListView hiện thị dữ liệu Danh sách, ứng dụng hiện thị các sản phẩm. Nâng cấp ví dụ này bằng cách dữ liệu lưu ở SQLite, cho phép tạo ra sản phẩm, bấm chọn để edit, xoá sản phẩm …

Mã nguồn đầy đủ lưu tại: Ví dụ SQLite (phần 1), bạn tải về để đọc mã nguồn. Có thể tải bằng lệnh Git

sqliteNhững chú ý khi đọc code ví dụ:

Kiểm tra một bảng đã tồn tại trong CSDL

Một số tác vụ, như đọc dữ liệu sẽ kiểm tra bảng có tên product tồn tại hay không, làm điều này bằng đoạn code:

Nạp dữ liệu sản phẩm vào mảng của Adapter (ListView):Các sản phẩm lưu ở bảng product được nạp vào Adapter của ListView, sử dụng phương thức rawQuery để chạy câu lệnh SELECT, qua đó thu được đối tượng Cursor giữ tập hợp dữ liệu trả về, duyệt qua tập này để lấy dữ liệu. Đoạn code cơ bản như sau:

Activity soạn thảo / thêm mới sản phẩmKhi bấm vào nút Thêm sản phẩm thì sẽ mở một Activity có tên EditProduct để thêm sản phẩm, hoặc khi bấm chọn thì cũng mở Activity này để chỉnh sửa, xoá …

Code có sử dụng kỹ thuật truyền dữ liệu qua lại giữa các Activity (xem thêm Activity cơ bản để biết chi tiết.). Trong đó, khi bấm chuột vào thêm mới, thì Intent truyền giá trị isupdate là false lúc này Activity khởi tạo là thêm sản phẩm. Ngược lại khi bấm vào chọn phần tử thì truyền giá trị này là false để khởi tạo Activity là cập nhật dữ liệu sẵn có.

Nạp lại ListView khi đóng cửa sổ soạn thảo

Mỗi khi Activity soạn thảo đóng lại (MainActivity nhận biết được Activity khác nó gọi đóng lại ở phương thức onActivityResult) thì nạp lại dữ liệu cho ListView

EditProduct đọc dữ liệu sản phẩm cần soạn thảo

Khi EditProduct mở ra, nếu nó cần đọc dữ liệu soạn thảo thì sẽ nạp từ Database, đoạn code như sau:

Xoá một sản phẩm đoạn code như sau:

Save sản phẩm vào DB

Trên đây đã áp dụng các truy vấn cơ bản đến SQLite, ngoài ra còn có các phương thức chuyên biệt tiện lợi hơn sẽ trình bày ở phần tiếp nhất là kỹ thuật sử dụng SQLiteOpenHelper

Bài viết khác

Hồ Diên Lợi
Đến với CNTT là tình cờ, tuy nhiên khi đã tham gia rồi thì mới biết đây chính là đam mê, hy vọng dịch bệnh Covid-19 sẽ qua, để chia sẽ đam mê công nghệ đến nhiều người hơn!

DANH SÁCH BÀI HỌC