Tính bền vững dữ liệu đảm bảo thông tin người dùng được bảo toàn giữa các phiên làm việc của ứng dụng di động. Nếu không có công nghệ này, mỗi lần khởi động sẽ bắt đầu từ đầu — cài đặt, lịch sử và tệp đã tải sẽ bị mất khi đóng. Theo Google Developers, 2024, hơn 90% ứng dụng di động sử dụng ít nhất một cơ chế bền vững để bảo toàn dữ liệu người dùng và trạng thái giao diện.
Điểm chính
Data Persistence là khả năng của ứng dụng lưu dữ liệu vào bộ nhớ không bay hơi của thiết bị. Trong phát triển di động, tính bền vững bao gồm cơ sở dữ liệu, hệ thống tệp, cài đặt và bộ nhớ đệm. Mỗi cơ chế có các đặc điểm riêng về hiệu suất, bảo mật và dung lượng lưu trữ.
Dữ liệu tạm thời chỉ tồn tại trong RAM và bị mất khi kết thúc tiến trình. Điều này bao gồm trạng thái màn hình, tính toán tạm thời và bộ nhớ đệm hình ảnh. Dữ liệu bền vững được ghi vào hệ thống tệp hoặc cơ sở dữ liệu và vẫn khả dụng sau khi khởi động lại ứng dụng. Điều này bao gồm cài đặt người dùng, mã thông báo quyền, lịch sử thao tác và nội dung đã tải.
Khi chọn phương pháp lưu trữ, nhà phát triển đánh giá một số yếu tố. Loại dữ liệu quyết định cấu trúc lưu trữ: cài đặt đơn giản — SharedPreferences hoặc DataStore, bản ghi có cấu trúc — SQLite hoặc Room, tệp — File Storage. Khối lượng dữ liệu ảnh hưởng đến hiệu suất: cơ sở dữ liệu được tối ưu cho hàng nghìn bản ghi, trong khi tệp phù hợp cho các đối tượng nhị phân lớn. Bảo mật yêu cầu mã hóa thông tin nhạy cảm qua EncryptedSharedPreferences hoặc SQLCipher.
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences là cách cổ điển để lưu trữ cặp khóa-giá trị trên Android. API này có sẵn từ các phiên bản đầu tiên của nền tảng và hỗ trợ các kiểu nguyên thủy: chuỗi, số, giá trị boolean. Dữ liệu được lưu trong tệp XML trong thư mục riêng của ứng dụng và chỉ có tiến trình ứng dụng mới có thể truy cập.
Jetpack DataStore là sự thay thế hiện đại cho SharedPreferences được xây dựng trên Kotlin Coroutines và Flow. DataStore cung cấp hai biến thể: Preferences DataStore cho các giá trị đơn giản và Proto DataStore cho các đối tượng được phân loại. Không giống SharedPreferences, DataStore đảm bảo tính nhất quán dữ liệu dưới truy cập đồng thời và hỗ trợ các thao tác bất đồng bộ mà không chặn luồng chính.
// SharedPreferences — cách tiếp cận truyền thống
val prefs = context
.getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
putString("username", "john_doe")
putInt("score", 1500)
apply()
}
// DataStore — cách tiếp cận bất đồng bộ
val settingsDataStore = context
.createDataStore("settings.pb")
val usernameFlow: Flow<String> = settingsDataStore
.data
.map { it[USERNAME_KEY] ?: "" }
Trên iOS, tương đương của SharedPreferences là UserDefaults — hệ thống lưu trữ các giá trị đơn giản ở định dạng Property List. UserDefaults sử dụng truy cập đồng bộ và phù hợp với khối lượng nhỏ dữ liệu cấu hình, nhưng không được khuyến nghị để lưu trữ thông tin nhạy cảm.
SQLite là cơ sở dữ liệu quan hệ nhúng chạy trong tiến trình ứng dụng mà không cần máy chủ riêng. Đây là DBMS phổ biến nhất trong phát triển di động: nó được sử dụng mặc định trên cả hai nền tảng. Android bao gồm SQLite trong SDK, iOS bao gồm nó trong thư viện libsqlite3. SQLite hỗ trợ SQL tiêu chuẩn, giao dịch, chỉ mục và trình kích hoạt.
Làm việc với SQLite bắt đầu bằng cách xác định lược đồ cơ sở dữ liệu. Nhà phát triển xác định bảng, trường và loại của chúng, sau đó thực hiện các thao tác chèn, đọc, cập nhật và xóa. SQLiteOpenHelper trên Android quản lý việc tạo và di chuyển cơ sở dữ liệu, trong khi iOS sử dụng giao diện C hoặc trình bao bọc FMDB.
// SQLiteOpenHelper trên Android
class DBHelper(context: Context) :
SQLiteOpenHelper(context, "app.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
}
fun insertUser(name: String, email: String) {
val db = writableDatabase
val values = ContentValues().apply {
put("name", name)
put("email", email)
}
db.insert("users", null, values)
}
}
| Loại dữ liệu | SharedPreferences | SQLite | Hệ thống tệp |
|---|---|---|---|
| Loại | khóa-giá trị | DB quan hệ | tệp nhị phân |
| Khối lượng | hàng trăm bản ghi | hàng nghìn bản ghi | không gian trống |
| Hiệu suất | cao | trung bình | phụ thuộc kích thước |
| Sử dụng điển hình | cài đặt | dữ liệu có cấu trúc | hình ảnh, video |
Room là một thư viện từ Jetpack cung cấp lớp ORM trên SQLite. Room loại bỏ công việc lặp đi lặp lại của việc viết truy vấn SQL và ContentValues, thay thế chúng bằng chú thích và hàm Kotlin. Trình biên dịch Room tạo ra các triển khai DAO (Data Access Object) tại thời điểm xây dựng, loại bỏ lỗi cú pháp SQL.
Để tích hợp Room, bạn cần thêm phụ thuộc kapt và chú thích lớp thực thể, giao diện DAO và lớp cơ sở dữ liệu. RoomDatabase đóng vai trò là điểm truy cập: thông qua nó, bạn nhận được DAO và thực hiện các thao tác cơ sở dữ liệu. Room hỗ trợ Flow cho truy vấn phản ứng, di chuyển lược đồ và xác minh truy vấn tại thời điểm biên dịch.
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "full_name") val name: String,
@ColumnInfo val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): Flow<List<User>>
@Insert
suspend fun insert(user: User)
@Delete
suspend fun delete(user: User)
}
@Database(
entities = [User::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Core Data là framework của Apple để quản lý đồ thị đối tượng và lưu trữ nó trên đĩa. Không giống Room, Core Data không làm việc với bảng mà với các đối tượng được quản lý (NSManagedObject) tạo thành hệ thống phân cấp các mối quan hệ. Core Data hỗ trợ tải lười, hoàn tác thay đổi và truy vấn phức tạp qua NSFetchRequest.
Cốt lõi của Core Data bao gồm ba thành phần: bối cảnh đối tượng được quản lý (NSManagedObjectContext), điều phối viên lưu trữ bền vững (NSPersistentStoreCoordinator) và mô hình dữ liệu (NSManagedObjectModel). NSPersistentContainer hợp nhất tất cả các thành phần thành một điểm truy cập duy nhất, đơn giản hóa việc thiết lập cho các ứng dụng Swift hiện đại.
import CoreData
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "AppModel")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed: \(error)")
}
}
}
func saveUser(name: String, email: String) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.email = email
do {
try context.save()
} catch let error {
print("Save error: \(error)")
}
}
}
Lưu trữ tệp (File Storage) được sử dụng để lưu hình ảnh, video và tài liệu. Android cung cấp bộ nhớ trong (context.filesDir) — riêng tư cho ứng dụng và bộ nhớ ngoài (Environment.getExternalStorageDirectory) — có thể truy cập bởi các ứng dụng khác. Trên iOS, tệp được lưu trong thư mục Documents và Library, trong đó Library/Caches dành cho bộ nhớ đệm không được sao lưu vào iCloud. Đối với thao tác tệp, cả hai nền tảng đều cung cấp File API và thao tác đọc/ghi luồng. Các thư viện hiện đại như Coil và SDWebImage thêm lớp bộ nhớ đệm, kết hợp lưu trữ tệp với RAM để hiệu suất tối ưu.
Trên Android, một giải pháp thay thế cho Core Data về độ phức tạp và chức năng là Realm, cơ sở dữ liệu hướng đối tượng hoạt động trực tiếp với các mô hình mà không có lớp SQL. Realm nhanh hơn SQLite trong các thao tác đọc và hỗ trợ các đối tượng trực tiếp tự động cập nhật UI khi dữ liệu thay đổi.
Câu hỏi thường gặp
Data Persistence là cơ chế lưu dữ liệu vào bộ nhớ không bay hơi của thiết bị, đảm bảo khả năng truy cập sau khi khởi động lại ứng dụng. Bao gồm cơ sở dữ liệu, lưu trữ tệp và hệ thống cài đặt.
Room là lớp ORM trên SQLite loại bỏ việc viết thủ công truy vấn SQL và ContentValues. Room xác minh truy vấn SQL tại thời điểm biên dịch, hỗ trợ Kotlin Coroutines và Flow, và tự động tạo mã truy cập dữ liệu.
SharedPreferences phù hợp để lưu trữ một lượng nhỏ dữ liệu đơn giản: cài đặt ứng dụng, cờ, mã nhận dạng và tùy chọn người dùng. Đối với dữ liệu phức tạp hoặc có cấu trúc, tốt hơn nên sử dụng Room hoặc DataStore.
Core Data là framework của Apple để quản lý đồ thị đối tượng. Nó cung cấp các đối tượng được quản lý, theo dõi thay đổi, tải lười và lưu trữ tự động vào kho lưu trữ (SQLite, XML hoặc định dạng nhị phân).
Lựa chọn phụ thuộc vào độ phức tạp của dữ liệu: cho cài đặt — DataStore hoặc UserDefaults, cho bản ghi có cấu trúc — Room (Android) hoặc Core Data (iOS), cho tệp — File Storage. Các tiêu chí bao gồm khối lượng dữ liệu, yêu cầu hiệu suất và nhu cầu mã hóa. Kết hợp nhiều cơ chế trong một ứng dụng là thực hành tiêu chuẩn cho phép tận dụng điểm mạnh của mỗi phương pháp.
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.
Đọc thêm