欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 第8天:数据存储

第8天:数据存储

2024/11/30 8:49:39 来源:https://blog.csdn.net/weixin_41644568/article/details/142915381  浏览:    关键词:第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.writableDatabaseval 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 {@Insertsuspend 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,用于输入用户名和年龄,以及保存和显示按钮:

<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"}}
}

运行项目

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

总结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com