Lưu trữ dữ liệu trong phát triển di động: khái niệm, phương pháp và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-03-08 Thời gian đọc: 9 phút

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

  • Room (Android) và Core Data (iOS) là ORM chính thức để làm việc với cơ sở dữ liệu quan hệ trên mỗi nền tảng
  • SharedPreferences (Android) đang được thay thế bằng DataStore — kho lưu trữ khóa-giá trị không đồng bộ và an toàn kiểu
  • Để lưu trữ token an toàn, hãy sử dụng Keystore (Android) và Keychain (iOS) với bảo vệ phần cứng
  • Firebase Firestore là cơ sở dữ liệu NoSQL với đồng bộ hóa thời gian thực và chế độ ngoại tuyến
  • Tuần tự hóa — chuyển đổi đối tượng thành JSON/Protobuf qua Gson, Moshi, kotlinx.serialization

Cơ sở dữ liệu cục bộ: SQLite, Room, Core Data, Realm

Để 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

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 (Android)

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.

kotlin
@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 (iOS)

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

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.

Kho lưu trữ khóa-giá trị và cài đặt

Để 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 (Android)

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 (Jetpack Android)

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.

NSUserDefaults (iOS)

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.

Cơ sở dữ liệu đám mây: Firebase Firestore và Realtime DB

Để 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.

Cloud Firestore

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

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ệuBộ sưu tập → Tài liệuCây JSON
Truy vấnPhức tạp (lọc, sắp xếp, giới hạn)Đơn giản (theo khóa)
Mở rộngTự độngPhân mảnh thủ công
Chế độ ngoại tuyếnCó (bộ nhớ đệm bền vững)
Giá cảTheo thao tác đọc/ghiTheo lưu lượng + lưu trữ

Lưu trữ an toàn: Keystore, Keychain và EncryptedSharedPreferences

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

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).

iOS Keychain

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 (Android)

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.

Lưu trữ tệp: Internal, External, Cache Directory

Đố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 Storage

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 Storage

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 dữ liệu: JSON, Protobuf và thư viện

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.

Định dạng

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ụ.

Thư viện Android

  • Gson (Google) — đơn giản, linh hoạt, nhưng chậm. Hoạt động tự động với đối tượng Java/Kotlin
  • Moshi (Square) — nhanh hơn Gson, hỗ trợ Kotlin tốt hơn (thuộc tính không null, giá trị mặc định, lớp sealed)
  • kotlinx.serialization — tuần tự hóa Kotlin gốc từ JetBrains, hoạt động tại thời điểm biên dịch, hỗ trợ JSON, Protobuf, CBOR

Thư viện iOS

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.

swift
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)

Giải pháp đa nền tảng: Hive, ObjectBox, Drift

Đối với Flutter và React Native, có các thư viện lưu trữ hiệu quả riêng.

Hive (Flutter)

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

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 (trước đây là Moor)

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

Cái nào tốt hơn cho lưu trữ dữ liệu cục bộ: Room hay Core Data?

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 khác DataStore như thế nào?

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.

Làm thế nào để lưu trữ token và mật khẩu an toàn trong ứng dụng di động?

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.

Firebase Firestore là gì và khi nào nên sử dụng?

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ị.

Các ORM nào tồn tại cho Flutter và React Native?

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

  • Room (Android) và Core Data (iOS) là các giải pháp chính thức cho cơ sở dữ liệu quan hệ trên mỗi nền tảng
  • DataStore thay thế SharedPreferences để lưu trữ cài đặt không đồng bộ
  • Keystore / Keychain là bắt buộc để lưu trữ an toàn token và khóa
  • Firebase Firestore là lựa chọn tốt nhất cho đồng bộ hóa thời gian thực giữa các thiết bị
  • Kotlinx.serialization (Android) và Codable (iOS) là các phương pháp tuần tự hóa hiện đại
  • Cho Flutter: Drift (SQLite), Hive (khóa-giá trị), ObjectBox (hiệu suất cao)
  • Realm là giải pháp thay thế đa nền tảng cho SQLite với thông báo phản ứng

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.

Thảo luận dự án