Lưu trữ dữ liệu là một trong những nhiệm vụ chính của ứng dụng di động, ảnh hưởng đến hiệu suất, bảo mật và trải nghiệm người dùng. Trong bài viết này, chúng ta sẽ tìm hiểu về SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore và Keychain, cũng như các định dạng tuần tự hóa (JSON, Protobuf) và thư viện (Gson, Moshi, kotlinx.serialization). Hướng dẫn này sẽ giúp các nhà phát triển mới chọn giải pháp lưu trữ dữ liệu phù hợp. Tìm hiểu thêm trong hướng dẫn chính thức của Android về lưu trữ dữ liệu.
Các điểm chính
Để lưu trữ dữ liệu có cấu trúc với mối quan hệ giữa các thực thể, cơ sở dữ liệu quan hệ được sử dụng.
SQLite là cơ sở dữ liệu quan hệ nhúng hoạt động trên mọi nền tảng di động. Không cần máy chủ riêng, dữ liệu được lưu trong một tệp duy nhất. SQLite là nền tảng cho Room (Android) và tùy chọn cho Core Data (iOS). Thư viện: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room là thư viện Android Architecture Components chính thức để làm việc với SQLite. Nó cung cấp lớp ORM: Entity (bảng), DAO (truy vấn), Database (điểm vào). Room kiểm tra truy vấn SQL tại thời điểm biên dịch, hỗ trợ coroutines và Flow, và tự động di chuyển schema.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data là framework của Apple để quản lý đồ thị đối tượng. Nó không phải là cơ sở dữ liệu thuần túy — nó là lớp bền vững trên SQLite, XML hoặc lưu trữ nhị phân. Core Data quản lý đối tượng (NSManagedObject), mối quan hệ, phiên bản schema, hoàn tác/làm lại và đa luồng qua NSManagedObjectContext.
Realm là một giải pháp thay thế cho SQLite, được thiết kế như cơ sở dữ liệu di động hiệu suất cao. Realm nhanh hơn SQLite trong đọc và ghi, hỗ trợ thông báo phản ứng (Live Objects), mã hóa tức thời và đa nền tảng (Android, iOS, Flutter, React Native). Nhược điểm: kích thước APK/IPA tăng và sử dụng bộ nhớ nhiều hơn.
Để lưu trữ lượng nhỏ dữ liệu (cài đặt, token, bộ nhớ đệm), các kho lưu trữ khóa-giá trị đơn giản được sử dụng.
SharedPreferences là kho lưu trữ khóa-giá trị cũ trong Android. Nhược điểm: truy cập đồng bộ (chặn UI khi đọc), thiếu kiểu dữ liệu, nguy cơ ANR khi tải tệp lớn. KHÔNG được khuyến nghị cho các dự án mới.
DataStore là sự thay thế hiện đại cho SharedPreferences từ Google. Nó hoạt động không đồng bộ qua Kotlin Coroutines và Flow, hỗ trợ Preferences DataStore (khóa-giá trị) và Proto DataStore (dữ liệu có kiểu qua Protobuf). DataStore an toàn cho luồng UI và hỗ trợ giao dịch.
UserDefaults là kho lưu trữ tiêu chuẩn cho các cài đặt nhỏ trong iOS. Nó hỗ trợ các kiểu nguyên thủy, chuỗi, ngày tháng, Data. UserDefaults đồng bộ, do đó không phù hợp cho khối lượng dữ liệu lớn. Đăng ký giá trị qua register(defaults:) đặt giá trị mặc định.
Để lưu trữ dữ liệu trong các ứng dụng yêu cầu đồng bộ hóa giữa các thiết bị, cơ sở dữ liệu đám mây Firebase được sử dụng.
Firebase Firestore là cơ sở dữ liệu tài liệu NoSQL với đăng ký thời gian thực, tự động mở rộng, truy vấn mạnh mẽ và chế độ ngoại tuyến tích hợp. Dữ liệu được tổ chức thành các bộ sưu tập và tài liệu (cấu trúc giống JSON). Firestore hỗ trợ giao dịch và hoạt động hàng loạt. Lý tưởng cho trò chuyện, nguồn cấp dữ liệu và ứng dụng xã hội.
Firebase Realtime Database là cơ sở dữ liệu NoSQL cũ hơn của Firebase lưu trữ dữ liệu dưới dạng một cây JSON duy nhất. Đơn giản hơn Firestore nhưng kém linh hoạt hơn trong truy vấn và mở rộng. Được khuyến nghị cho các ứng dụng thời gian thực đơn giản (trạng thái trực tuyến, trò chuyện đơn giản).
| Đặc điểm | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Mô hình dữ liệu | Bộ sưu tập → Tài liệu | Cây JSON |
| Truy vấn | Phức tạp (lọc, sắp xếp, giới hạn) | Đơn giản (theo khóa) |
| Mở rộng | Tự động | Phân mảnh thủ công |
| Chế độ ngoại tuyến | Có (bộ nhớ đệm bền vững) | Có |
| Giá cả | Theo thao tác đọc/ghi | Theo lưu lượng + lưu trữ |
Việc lưu trữ token, mật khẩu và khóa mã hóa yêu cầu kho lưu trữ được bảo vệ đặc biệt.
Android Keystore là kho lưu trữ hệ thống cho các khóa mật mã. Các khóa được lưu trữ trong môi trường phần cứng (TEE — Trusted Execution Environment), không thể truy cập được bởi ứng dụng và hệ điều hành. Hỗ trợ tạo khóa, mã hóa và ký. Android 9+ bao gồm StrongBox Keymaster (chip chuyên dụng).
Keychain Services là kho lưu trữ an toàn iOS cho mật khẩu, khóa và chứng chỉ. Dữ liệu được mã hóa bằng Secure Enclave phần cứng. Keychain hỗ trợ các mức truy cập: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences là một lớp bao bọc SharedPreferences với mã hóa khóa và giá trị qua AES256-GCM và HKDF. Được triển khai trong thư viện AndroidX Security. Được khuyến nghị để lưu trữ token và cài đặt nhạy cảm.
Tại IT Sectr, chúng tôi sử dụng Android Keystore + EncryptedSharedPreferences để lưu trữ token làm mới và khóa sinh trắc học. Trên iOS, chúng tôi sử dụng Keychain với mức kSecAttrAccessibleWhenUnlockedThisDeviceOnly để bảo mật tối đa.
Đối với lưu trữ tệp (hình ảnh, video, tài liệu), các nền tảng di động cung cấp một số loại lưu trữ.
Android phân biệt Internal Storage (/data/data/gói/ — lưu trữ riêng tư) và External Storage (thẻ SD hoặc phân vùng mô phỏng). Cache Directory là bộ nhớ tạm thời mà hệ thống có thể xóa. Scoped Storage (Android 10+) hạn chế quyền truy cập vào External Storage — ứng dụng chỉ thấy tệp của chính mình hoặc tệp qua MediaStore/SAF.
iOS cung cấp Documents Directory (sao lưu iCloud, dữ liệu bền vững), Library/Caches (tệp tạm thời, không sao lưu) và Tmp Directory (tạm thời, có thể bị xóa). Sử dụng NSFileManager để làm việc với hệ thống tệp. iOS 11+ hỗ trợ File Provider cho tệp đám mây.
Tuần tự hóa chuyển đổi đối tượng thành định dạng để truyền hoặc lưu trữ. Giải tuần tự hóa là quá trình ngược lại.
JSON (JavaScript Object Notation) là định dạng phổ biến nhất: dễ đọc, linh hoạt, được hỗ trợ bởi tất cả các nền tảng. XML nghiêm ngặt hơn, được sử dụng trong các hệ thống cũ. Protobuf (Protocol Buffers) là định dạng nhị phân từ Google: nhỏ gọn hơn JSON 3-10 lần, phân tích nhanh hơn, có schema nghiêm ngặt. Được sử dụng cho các hệ thống tải cao và vi dịch vụ.
JSONSerialization là API tích hợp để làm việc với JSON. Codable (Encodable/Decodable) là giao thức Swift hiện đại để tuần tự hóa tự động thành JSON, Property List và các định dạng khác.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Đối với Flutter và React Native, có các thư viện lưu trữ hiệu quả riêng.
Hive là kho lưu trữ khóa-giá trị nhẹ, nhanh cho Flutter. Không yêu cầu mã gốc (Dart thuần túy), hỗ trợ kiểu dữ liệu qua TypeAdapter và hoạt động trong các isolate. Lý tưởng cho bộ nhớ đệm, cài đặt và khối lượng dữ liệu nhỏ.
ObjectBox là cơ sở dữ liệu nhúng hiệu suất cao cho Flutter, Android và iOS. Nhanh hơn SQLite 10+ lần, sử dụng cấu trúc tệp phẳng để giảm thiểu chi phí. Hỗ trợ mối quan hệ, truy vấn và đăng ký phản ứng (ObjectBox Dart).
Drift là thư viện SQLite phản ứng cho Flutter và Dart. Nó cung cấp truy vấn an toàn kiểu, di chuyển, hàm DAO và hỗ trợ Stream (cập nhật phản ứng). Drift là lựa chọn chính cho các dự án Flutter yêu cầu SQLite.
Câu hỏi thường gặp
Lựa chọn phụ thuộc vào nền tảng: Room (Android) là thư viện chính thức dựa trên SQLite với kiểm tra truy vấn tại thời điểm biên dịch. Core Data (iOS) là framework của Apple với đồ thị đối tượng. Cho các dự án đa nền tảng, Realm hoặc SQLite qua ORM phù hợp.
SharedPreferences là triển khai cũ với truy cập đồng bộ và nguy cơ ANR. DataStore (Jetpack) là sự thay thế hiện đại dựa trên Kotlin Coroutines và Flow, hỗ trợ bất đồng bộ, kiểu dữ liệu và bảo vệ lỗi.
Android: EncryptedSharedPreferences hoặc Android Keystore. iOS: Keychain Services với mức truy cập WhenUnlockedThisDeviceOnly. Cho dữ liệu quan trọng, sử dụng Secure Enclave (iOS) và Keystore phần cứng (Android) với sinh trắc học.
Cloud Firestore là cơ sở dữ liệu NoSQL từ Firebase với đồng bộ hóa thời gian thực, chế độ ngoại tuyến và tự động mở rộng. Phù hợp cho trò chuyện, nguồn cấp tin tức và các dự án cần đồng bộ hóa giữa các thiết bị.
Flutter: Hive (khóa-giá trị nhanh), Floor (ORM SQLite), Drift (Moor, SQLite phản ứng), ObjectBox (DB nhúng hiệu suất cao). React Native: Realm, WatermelonDB (tải lười) và AsyncStorage (tương tự SharedPreferences).
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.