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

安卓开发怎么获取数据源

本地数据源获取

SharedPreferences(轻量级键值存储)

  • 适用场景:存储少量简单配置信息(如用户设置、登录状态)

  • 使用步骤

    // 获取编辑器
    SharedPreferences prefs = context.getSharedPreferences("app_settings", MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    // 保存数据
    editor.putString("username", "JohnDoe");
    editor.apply(); // 异步提交
    // 读取数据
    String username = prefs.getString("username", "default_value");

SQLite数据库(结构化存储)

  • 适用场景:需要持久化存储复杂关系型数据

    安卓开发怎么获取数据源

  • 核心组件

    • SQLiteOpenHelper:数据库创建与升级
    • ContentValues:数据插入
    • Cursor:结果集查询
  • 示例代码

    // 创建数据库帮助类
    public class DBHelper extends SQLiteOpenHelper {
        public DBHelper(Context context) {
            super(context, "app_db", null, 1);
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
        }
        // ...其他方法
    }

内部/外部存储(文件系统)

存储类型 路径示例 适用场景
内部存储 /data/data/包名/files/ 私密文件存储
外部存储 /sdcard/Android/data/包名/ 媒体文件共享
// 写入内部存储
File file = new File(context.getFilesDir(), "config.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("key=value".getBytes());
}

网络数据源获取

Retrofit(HTTP请求库)

  • 核心配置

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    // 定义接口
    public interface ApiService {
        @GET("users/{id}")
        Call<User> getUser(@Path("id") int id);
    }
    // 发起请求
    ApiService api = retrofit.create(ApiService.class);
    api.getUser(123).enqueue(new Callback<User>() {
        @Override public void onResponse(Call<User> call, Response<User> response) { /.../ }
        @Override public void onFailure(Call<User> call, Throwable t) { /.../ }
    });

Volley(轻量级网络库)

  • 特点:自动排队、缓存、适配UI线程
  • 基本用法
    RequestQueue queue = Volley.newRequestQueue(context);
    StringRequest stringRequest = new StringRequest(
        Request.Method.GET, 
        "https://api.example.com/data",
        response -> tv.setText(response),  // 成功回调
        error -> Log.e("Volley", error.toString())  // 失败回调
    );
    queue.add(stringRequest);

WebSocket(长连接)

  • 适用场景:实时数据推送(如聊天室、股票行情)
  • 实现方式
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url("wss://echo.websocket.org").build();
    WebSocket ws = client.newWebSocket(request, new WebSocketListener() {
        @Override public void onMessage(WebSocket webSocket, String text) {
            Log.d("WS", "Received: " + text);
        }
        // ...其他回调
    });

特殊数据源处理

ContentProvider(跨应用数据共享)

  • 典型用途:访问联系人、媒体库等系统数据
  • 调用示例
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        String name = cursor.getString(nameIndex);
        cursor.close();
    }

传感器数据(硬件数据源)

  • 常见传感器类型

    • 加速度传感器(ACCELEROMETER)
    • 陀螺仪(GYROSCOPE)
    • 光线传感器(LIGHT)
  • 监听示例

    SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
    Sensor accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sm.registerListener(new SensorEventListener() {
        @Override public void onSensorChanged(SensorEvent event) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            // 处理三维加速度数据
        }
        @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {}
    }, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

数据源选择对比表

数据类型 本地存储 网络获取 实时性要求 典型场景
配置信息 SharedPreferences 用户设置
媒体文件 外部存储 多图上传API 图片分享
实时数据 WebSocket 聊天消息
结构化数据 SQLite REST API 用户信息

相关问题与解答

Q1:如何根据业务需求选择数据源?

  • A:考虑三个维度:
    1. 数据持久性:临时数据用内存/缓存,长期数据用数据库/存储
    2. 数据来源:设备内数据用本地存储,第三方数据用网络请求
    3. 访问频率:高频访问需优化(如使用Room数据库+LiveData)

Q2:如何处理网络请求的线程问题?

  • A:采用异步编程方案:
    • Retrofit:默认在子线程执行,通过enqueue回调主线程
    • 协程(Kotlin):viewModelScope.launch { ... }
    • RxJava:`Observable.just(1).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())