assets
或raw
资源)assets
文件夹AssetManager
读取文件内容 val inputStream = assets.open("data.json") val content = inputStream.bufferedReader().use { it.readText() }
适用场景:读取公共存储中的文件(需动态申请权限)
权限配置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
代码示例:
// 检查并申请权限(Android 6.0+) if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_CODE) } // 读取文件 val file = File(Environment.getExternalStorageDirectory(), "data.txt") val content = file.bufferedReader().use { it.readText() }
适用场景:从REST API获取JSON数据
依赖配置:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
代码示例:
interface ApiService { @GET("path/to/resource") suspend fun getData(): Response<DataModel> } val retrofit = Retrofit.Builder() .baseUrl("https://api.example.com") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(ApiService::class.java) // 在协程中调用 GlobalScope.launch { val response = service.getData() if (response.isSuccessful) { val data = response.body() // 处理数据 } }
适用场景:处理复杂响应或非JSON格式数据
代码示例:
val client = OkHttpClient() val request = Request.Builder() .url("https://api.example.com/data") .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理失败 } override fun onResponse(call: Call, response: Response) { response.body?.let { responseBody -> val content = responseBody.string() // 自定义解析逻辑 } } })
适用场景:结构化数据存储与查询
依赖配置:
implementation "androidx.room:room-runtime:2.4.3" kapt "androidx.room:room-compiler:2.4.3"
代码示例:
// 定义实体 @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, val name: String ) // 定义DAO @Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertAll(users: List<User>) @Query("SELECT FROM users") suspend fun getAllUsers(): List<User> } // 使用数据库 val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app-db").build() val userDao = db.userDao() GlobalScope.launch { userDao.insertAll(listOf(User(1, "Alice"), User(2, "Bob"))) val users = userDao.getAllUsers() }
.db
文件.db
文件放入assets
目录val dbFile = File(applicationContext.filesDir, "mydatabase.db") if (!dbFile.exists()) { assets.open("mydatabase.db").use { inputStream -> dbFile.outputStream().use { outputStream -> inputStream.copyTo(outputStream) } } } val db = SQLiteDatabase.openDatabase(dbFile.absolutePath, null, SQLiteDatabase.OPEN_READWRITE)
方式 | 适用场景 | 关键API |
---|---|---|
SharedPreferences | 轻量级键值对存储 | getSharedPreferences() |
Intent传递数据 | Activity/Fragment间数据传递 | putExtra() / getParcelableExtra() |
ContentProvider | 跨应用数据共享 | query() / insert() |
问题 | 解决方案 |
---|---|
文件读取失败 | 检查文件路径是否正确,确认已申请存储权限(Android 6.0+需动态申请) |
网络请求超时 | 配置OkHttp超时参数,使用await() 替代enqueue() 进行同步请求 |
Room数据库升级失败 | 定义Migration 类处理版本升级,或删除旧数据库重新创建 |
JSON解析异常 | 使用Gson 的FieldNamingPolicy 适配字段命名,或手动映射数据模型 |
A:可结合CipherOutputStream
对文件进行AES加密,示例如下:
val cipher = Cipher.getInstance("AES") val keySpec = SecretKeySpec("1234567890abcdef".toByteArray(), "AES") cipher.init(Cipher.ENCRYPT_MODE, keySpec) FileOutputStream(file).use { outputStream -> CipherOutputStream(outputStream, cipher).use { cipherStream -> cipherStream.write(plainText.toByteArray()) } }
A:通过Migration
接口实现数据迁移,示例:
class Migrations(private val context: Context) : RoomDatabase.Migration { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER") // 从旧表迁移数据到新表(如需) } } // 构建数据库时添加迁移策略 Room.databaseBuilder(context, AppDatabase::class.java, "app-db") .addMigrations(Migrations(context)) .build()