内容概述
该学习内容对应代码为: DataStorageDemo
在Android应用中,数据存储是一个重要的部分,用户的设置、应用的数据等都需要持久化存储。今天我们将重点介绍三种数据存储方式:SharedPreferences、SQLite和Room。
1. SharedPreferences
SharedPreferences 是一种轻量级的键值对存储,适合存储少量的简单数据(如用户偏好设置)。
代码示例
-
保存数据
val sharedPreferences = getSharedPreferences("user_prefs", MODE_PRIVATE) val editor = sharedPreferences.edit() editor.putString("username", "John") editor.putInt("age", 25) editor.apply() // 异步保存
-
读取数据
val username = sharedPreferences.getString("username", "default") // 提供默认值 val age = sharedPreferences.getInt("age", 0)
2. SQLite
SQLite是Android内置的关系型数据库,适合存储结构化的数据。使用SQLite时,需要定义数据库和表结构,并通过SQL语句进行操作。
代码示例
-
创建SQLiteHelper
class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase) { val createTable = "CREATE TABLE $TABLE_NAME (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)" db.execSQL(createTable) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME") onCreate(db) } // 增、查、改、删的方法 fun addUser(name: String, age: Int) { val db = this.writableDatabase val contentValues = ContentValues() contentValues.put("name", name) contentValues.put("age", age) db.insert(TABLE_NAME, null, contentValues) db.close() } }
-
使用SQLite
val dbHelper = DatabaseHelper(this) dbHelper.addUser("Alice", 30)
3. Room持久化库
Room是Android提供的一个持久化库,封装了SQLite,简化了数据库操作,支持RxJava和LiveData等。
代码示例
- 添加依赖
在build.gradle
中添加Room依赖:
dependencies {
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // Kotlin使用kapt
}
-
定义实体类
@Entity(tableName = "user_table") data class User( @PrimaryKey(autoGenerate = true) val id: Int = 0, val name: String, val age: Int )
-
创建DAO接口
@Dao interface UserDao { @Insert suspend fun insert(user: User) @Query("SELECT * FROM user_table") suspend fun getAllUsers(): List<User> }
-
创建数据库
@Database(entities = [User::class], version = 1) abstract class UserDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
-
使用Room数据库
val db = Room.databaseBuilder(applicationContext, UserDatabase::class.java, "user_database").build() val userDao = db.userDao() // 插入用户 CoroutineScope(Dispatchers.IO).launch { userDao.insert(User(name = "Bob", age = 28)) } // 查询用户 CoroutineScope(Dispatchers.IO).launch { val users = userDao.getAllUsers() // 更新UI等操作 }
工程创建过程
- 打开Android Studio,选择“New Project”。
- 选择“Empty Activity”,点击“Next”。
- 输入项目名称(如:DataStorageDemo),设置包名、保存位置、语言选择Kotlin。
- 点击“Finish”,等待Gradle同步完成。
实践实例:使用SharedPreferences和Room
1. 创建UI布局
在res/layout/activity_main.xml
中创建简单的UI,用于输入用户名和年龄,以及保存和显示按钮:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/editTextUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Username"/>
<EditText
android:id="@+id/editTextAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Age"
android:inputType="number"/>
<Button
android:id="@+id/buttonSave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save to SharedPreferences"/>
<Button
android:id="@+id/buttonRoom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save to Room"/>
<TextView
android:id="@+id/textViewOutput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="16dp"/>
</LinearLayout>
2. 实现功能逻辑
在MainActivity.kt
中实现SharedPreferences和Room的存储功能。
class MainActivity : AppCompatActivity() {
private lateinit var sharedPreferences: SharedPreferences
private lateinit var db: UserDatabase
private lateinit var userDao: UserDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sharedPreferences = getSharedPreferences("user_prefs", MODE_PRIVATE)
db = Room.databaseBuilder(applicationContext, UserDatabase::class.java, "user_database").build()
userDao = db.userDao()
findViewById<Button>(R.id.buttonSave).setOnClickListener {
saveToSharedPreferences()
}
findViewById<Button>(R.id.buttonRoom).setOnClickListener {
saveToRoom()
}
}
private fun saveToSharedPreferences() {
val username = findViewById<EditText>(R.id.editTextUsername).text.toString()
val age = findViewById<EditText>(R.id.editTextAge).text.toString().toInt()
val editor = sharedPreferences.edit()
editor.putString("username", username)
editor.putInt("age", age)
editor.apply()
displayData()
}
private fun saveToRoom() {
val username = findViewById<EditText>(R.id.editTextUsername).text.toString()
val age = findViewById<EditText>(R.id.editTextAge).text.toString().toInt()
CoroutineScope(Dispatchers.IO).launch {
userDao.insert(User(name = username, age = age))
displayDataFromRoom()
}
}
private fun displayData() {
val username = sharedPreferences.getString("username", "default")
val age = sharedPreferences.getInt("age", 0)
findViewById<TextView>(R.id.textViewOutput).text = "SharedPreferences: $username, Age: $age"
}
private fun displayDataFromRoom() {
val users = userDao.getAllUsers()
runOnUiThread {
val userText = users.joinToString { "${it.name}, Age: ${it.age}" }
findViewById<TextView>(R.id.textViewOutput).text = "Room Data: $userText"
}
}
}
运行项目
- 确保没有错误,点击运行按钮,选择模拟器或真实设备。
- 输入用户名和年龄,点击“Save to SharedPreferences”按钮,可以在文本框中看到保存的数据。
- 点击“Save to Room”按钮,数据将保存到Room数据库中,并在文本框中显示所有用户数据。
总结
今天你学习了如何在Android应用中使用SharedPreferences、SQLite和Room进行数据存储。通过实践实例,你已经能够实现简单的用户数据保存和读取功能。接下来,可以尝试对数据存储的方式进行比较和优化。