第8天:数据存储

内容概述

该学习内容对应代码为: DataStorageDemo

在Android应用中,数据存储是一个重要的部分,用户的设置、应用的数据等都需要持久化存储。今天我们将重点介绍三种数据存储方式:SharedPreferencesSQLiteRoom

1. SharedPreferences

SharedPreferences 是一种轻量级的键值对存储,适合存储少量的简单数据(如用户偏好设置)。

代码示例
  1. 保存数据

    val sharedPreferences = getSharedPreferences("user_prefs", MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    editor.putString("username", "John")
    editor.putInt("age", 25)
    editor.apply() // 异步保存
    
  2. 读取数据

    val username = sharedPreferences.getString("username", "default") // 提供默认值
    val age = sharedPreferences.getInt("age", 0)
    
2. SQLite

SQLite是Android内置的关系型数据库,适合存储结构化的数据。使用SQLite时,需要定义数据库和表结构,并通过SQL语句进行操作。

代码示例
  1. 创建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()
        }
    }
    
  2. 使用SQLite

    val dbHelper = DatabaseHelper(this)
    dbHelper.addUser("Alice", 30)
    
3. Room持久化库

Room是Android提供的一个持久化库,封装了SQLite,简化了数据库操作,支持RxJava和LiveData等。

代码示例
  1. 添加依赖

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
}
  1. 定义实体类

    @Entity(tableName = "user_table")
    data class User(
        @PrimaryKey(autoGenerate = true) val id: Int = 0,
        val name: String,
        val age: Int
    )
    
  2. 创建DAO接口

    @Dao
    interface UserDao {
        @Insert
        suspend fun insert(user: User)
    
        @Query("SELECT * FROM user_table")
        suspend fun getAllUsers(): List<User>
    }
    
  3. 创建数据库

    @Database(entities = [User::class], version = 1)
    abstract class UserDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    }
    
  4. 使用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等操作
    }
    

工程创建过程

  1. 打开Android Studio,选择“New Project”。
  2. 选择“Empty Activity”,点击“Next”。
  3. 输入项目名称(如:DataStorageDemo),设置包名、保存位置、语言选择Kotlin。
  4. 点击“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"
        }
    }
}

运行项目

  1. 确保没有错误,点击运行按钮,选择模拟器或真实设备。
  2. 输入用户名和年龄,点击“Save to SharedPreferences”按钮,可以在文本框中看到保存的数据。
  3. 点击“Save to Room”按钮,数据将保存到Room数据库中,并在文本框中显示所有用户数据。

总结

今天你学习了如何在Android应用中使用SharedPreferences、SQLite和Room进行数据存储。通过实践实例,你已经能够实现简单的用户数据保存和读取功能。接下来,可以尝试对数据存储的方式进行比较和优化。

上一篇:YOLOv11改进策略【模型轻量化】| 替换华为的极简主义骨干网络:VanillaNet


下一篇:基于YOLO11/v10/v8/v5深度学习的农作物类别检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】