上一篇
安卓开发写入数据
- 行业动态
- 2025-04-22
- 4430
安卓开发写入数据可通过SharedPreferences、SQLite、文件存储或网络请求
SharedPreferences存储
适用场景:轻量级键值对数据(如用户设置、登录状态)
存储位置:/data/data/包名/shared_prefs/
API:getSharedPreferences()
、edit()
、putString()
、apply()
操作步骤 | 代码示例 | 说明 |
---|---|---|
获取实例 | SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); | 创建或打开指定文件 |
写入数据 | sp.edit().putString("username", "admin").apply(); |apply() 异步提交,commit() 同步 | |
读取数据 | String name = sp.getString("username", "default"); | 默认值防止空指针 |
注意事项:
- 键值对类型需匹配(
putString()
对应getString()
) - 频繁调用
edit()
会覆盖之前未提交的修改
文件存储
适用场景:文本/二进制文件(如配置文件、缓存数据)
存储位置:/data/data/包名/files/
(内部存储)或Environment.getExternalStorageDirectory()
(SD卡)
API:openFileOutput()
、openFileInput()
文件类型 | 写入方式 | 读取方式 | 权限注意 |
---|---|---|---|
文本文件 | FileOutputStream | BufferedReader | 需声明WRITE_EXTERNAL_STORAGE 权限(Android 10+需特殊处理) |
二进制文件 | FileOutputStream | FileInputStream | SD卡存储需动态申请权限 |
示例代码:
// 写入内部存储 FileOutputStream fos = openFileOutput("data.txt", Context.MODE_PRIVATE); fos.write("Hello".getBytes()); fos.close(); // 读取内部存储 BufferedReader br = new BufferedReader(new FileReader(getFilesDir()+"/data.txt")); String line = br.readLine(); // 读取内容
SQLite数据库
适用场景:结构化数据(如用户信息、订单记录)
核心组件:SQLiteOpenHelper
(版本管理)、SQLiteDatabase
(增删改查)
操作步骤 | 关键代码 | 说明 |
---|---|---|
创建数据库 | SQLiteOpenHelper helper = new DBHelper(context);<br>SQLiteDatabase db = helper.getWritableDatabase(); |onCreate() 方法执行表结构创建 | |
插入数据 | ContentValues cv = new ContentValues();<br>cv.put("name", "John");<br>db.insert("users", null, cv); | 自动处理SQL拼接 |
查询数据 | Cursor cursor = db.query("users", null, "id=?", new String[]{"1"}, null, null, null); | 返回结果集需手动关闭 |
注意事项:
- 数据库升级需重写
onUpgrade()
方法 - 主线程操作数据库会抛出异常,需使用
AsyncTask
或Executor
ContentProvider存储
适用场景:跨应用数据共享(如访问通讯录、图片库)
核心API:ContentResolver.insert()
、query()
、update()
、delete()
操作类型 | 代码示例 | 说明 |
---|---|---|
插入数据 | ContentValues values = new ContentValues();<br>values.put(ContactsContract.Data.DISPLAY_NAME, "Alice");<br>resolver.insert(ContactsContract.Data.CONTENT_URI, values); | 需处理Uri 返回值 | |
查询数据 | Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); | 需处理权限(如READ_CONTACTS ) |
网络存储
适用场景:云端数据同步(如用户登录信息、文件上传)
常用方式:Retrofit+OKHttp、Volley、Firebase Cloud Firestore
技术栈 | 特点 | 适用场景 |
---|---|---|
Retrofit | 基于注解的HTTP客户端 | RESTful API交互 |
Firebase | 实时数据库 | 聊天应用、实时协作 |
Volley | 轻量级网络库 | 图片加载、小规模数据请求 |
示例代码(Retrofit):
// 定义接口 public interface ApiService { @POST("/user/login") Call<ResponseBody> login(@Body Map<String, String> credentials); } // 发送请求 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService service = retrofit.create(ApiService.class); service.login(credentials).enqueue(new Callback<>() { ... });
相关问题与解答
Q1:SharedPreferences和文件存储有什么区别?
A1:
| 对比维度 | SharedPreferences | 文件存储 |
|———|——————|———-|
| 数据格式 | 键值对(XML存储) | 文本/二进制 |
| 性能 | 适合少量高频读写 | 适合大文件或复杂结构 |
| 用途 | 配置、状态保存 | 日志、缓存文件 |
Q2:如何安全升级SQLite数据库版本?
A2:
- 版本号管理:在
SQLiteOpenHelper
中重写onUpgrade()
,@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER"); // 添加新列 } }
- 数据迁移策略:
- 备份旧数据 → 修改表结构 → 恢复数据
- 使用
db.execSQL()
执行迁移脚本
- 测试覆盖:在开发阶段模拟多版本升级,验证数据