类型 | 特点 | 适用场景 |
---|---|---|
本地数据库(SQLite/Room) | 轻量级、无需网络、直接访问本地文件 | 离线功能、简单数据存储、低延迟 |
云数据库(Firebase/AWS) | 实时同步、高扩展性、跨设备共享 | 多端同步、复杂查询、大规模数据 |
混合方案 | 本地缓存 + 云端同步 | 需要离线支持且需数据持久化的应用 |
最小化存储敏感信息
数据表结构示例
| 字段名 | 类型 | 说明 |
|—————-|—————|——————————|
| userId | TEXT/INTEGER | 唯一标识符(主键) |
| username | TEXT | 用户名(唯一约束) |
| email | TEXT | 邮箱(唯一约束) |
| avatarUrl | TEXT | 头像链接 |
| createdAt | INTEGER | 注册时间戳 |
| lastLogin | INTEGER | 上次登录时间 |
扩展性设计
ContentProvider
或LiveData
实现多模块数据共享。JSON
或Protobuf
存储复杂数据结构(如用户偏好设置)。// 定义实体类 @Entity(tableName = "user_info") data class UserInfo( @PrimaryKey val userId: String, val username: String, val email: String, val avatarUrl: String?, val createdAt: Long, val lastLogin: Long ) // 定义DAO @Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUser(user: UserInfo) @Query("SELECT FROM user_info WHERE userId = :id") suspend fun getUserById(id: String): UserInfo? } // 使用示例 val user = UserInfo(...) viewModelScope.launch { userDao.insertUser(user) }
// 初始化Firebase val db = Firebase.database.reference // 写入用户数据 val user = mapOf( "userId" to "123", "username" to "JohnDoe", "email" to "john@example.com" ) db.child("users").child("123").setValue(user) // 读取用户数据 db.child("users").child("123").get().addOnSuccessListener { val username = it.child("username").value as String }
问题 | 解决方案 |
---|---|
数据同步冲突 | 使用MergeField 标记字段或自定义合并逻辑(如最后修改时间戳)。 |
离线数据一致性 | 启用Firebase Persistence或SQLite本地缓存,配合网络状态监听自动同步。 |
数据安全风险 | 强制使用加密存储(如Android Keystore ),限制数据库文件权限(MODE_PRIVATE )。 |
解答:
解答:
Android Keystore
生成密钥对密码加密。 SecurePreferences
或EncryptedSharedPreferences
存储敏感数据。 val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC val keyStore = KeyStore.getInstance("AndroidKeyStore") keyStore.load(null) val key = keyStore.getKey(keyGenParameterSpec.keyAlias, null) val cipher = Cipher.get("AES/GCM/NoPadding") cipher.init(Cipher.ENCRYPT_MODE, key) val encryptedPassword = cipher.doFinal(password.toByteArray())