内容概述
该学习内容对应代码为: 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.writableDatabaseval 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 {@Insertsuspend 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,用于输入用户名和年龄,以及保存和显示按钮:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/editTextUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Username"/><EditTextandroid:id="@+id/editTextAge"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Age"android:inputType="number"/><Buttonandroid:id="@+id/buttonSave"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Save to SharedPreferences"/><Buttonandroid:id="@+id/buttonRoom"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Save to Room"/><TextViewandroid: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: SharedPreferencesprivate lateinit var db: UserDatabaseprivate lateinit var userDao: UserDaooverride 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进行数据存储。通过实践实例,你已经能够实现简单的用户数据保存和读取功能。接下来,可以尝试对数据存储的方式进行比较和优化。