上一篇
安卓开发怎样调用数据库
- 行业动态
- 2025-04-22
- 7
安卓中常见的数据库类型
安卓开发中常用的数据库包括:
| 数据库类型 | 特点 |
|——————|———————————————————————-|
| SQLite | 轻量级嵌入式数据库,Android内置支持,适合本地存储 |
| Room(SQLite封装)| 基于SQLite的抽象层,提供编译时校验和流畅API,推荐现代开发使用 |
| 网络数据库 | 如MySQL、Firebase等,需通过网络连接,适合云端数据存储与同步 |
使用SQLite直接操作数据库
创建数据库Helper类
class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase) { // 创建表语句 val createTable = """ CREATE TABLE user ( 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 user") onCreate(db) } companion object { private const val DATABASE_NAME = "app_database.db" private const val DATABASE_VERSION = 1 } }
增删改查操作示例
// 插入数据 val db = helper.writableDatabase val values = ContentValues().apply { put("name", "张三") put("age", 25) } db.insert("user", null, values) // 查询数据 val cursor = db.query("user", null, "age > ?", arrayOf("20"), null, null, null) while (cursor.moveToNext()) { val name = cursor.getString(cursor.getColumnIndex("name")) // 处理数据 } cursor.close()
使用Room组件(推荐方式)
定义实体类
@Entity(tableName = "user") data class User( @PrimaryKey(autoGenerate = true) val id: Int, val name: String, val age: Int )
创建DAO接口
@Dao interface UserDao { @Insert suspend fun insert(user: User) @Query("SELECT FROM user WHERE age > :minAge") suspend fun getUsersOlderThan(minAge: Int): List<User> }
创建数据库类
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
使用示例(协程作用域)
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "app_database.db" ).build() // 插入数据 db.userDao().insert(User(0, "李四", 30)) // 查询数据 val users = db.userDao().getUsersOlderThan(25)
操作网络数据库(以Firebase为例)
添加依赖
implementation 'com.google.firebase:firebase-database:20.1.0'
初始化与读写操作
// 初始化Firebase Firebase.initialize(context) val database = FirebaseDatabase.getInstance() val userRef = database.getReference("users") // 写入数据 val user = hashMapOf<String, Any>( "name" to "王五", "age" to 28 ) userRef.push().setValue(user) // 读取数据 userRef.addChildEventListener(object : ChildEventListener { override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) { val name = snapshot.child("name").getValue(String::class.java) // 处理数据 } // 其他回调方法... })
相关问题与解答
问题1:Room相比SQLite的优势是什么?
解答:
Room通过编译时校验避免语法错误,提供流畅API(如LiveData、Flow),支持协程,减少模板代码,更适合现代安卓开发。
问题2:如何处理网络数据库的离线缓存?
解答:
可结合FirebaseOfflineCapabilities
启用离线持久化:
FirebaseDatabase.getInstance().setPersistenceEnabled(true)
或使用Room作为本地缓存,配合网络请求实现数据同步