当前位置:首页 > 行业动态 > 正文

安卓开发怎样调用数据库

安卓中常见的数据库类型

安卓开发中常用的数据库包括:
| 数据库类型 | 特点 |
|——————|———————————————————————-|
| 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作为本地缓存,配合网络请求实现数据同步

0