You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java从API获取数据并存储到移动端数据库(入门级)

用Java从API获取数据并存储到移动端数据库(针对初学者)

一、从API获取数据(以Android平台为例,使用OkHttp库)

对于移动端Java开发(Android),OkHttp是上手简单且常用的网络请求库,以下是基础步骤:

1. 添加依赖

在你的Module级build.gradle(或build.gradle.kts)的依赖块中添加OkHttp依赖:

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

同步项目,确保依赖下载完成。

2. 编写网络请求代码

注意:Android禁止在主线程执行网络请求,所以要使用异步请求或子线程:

// 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();

// 构建请求(以GET请求为例,替换成你的API地址)
Request request = new Request.Builder()
        .url("https://api.example.com/users/1")
        .build();

// 发起异步请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(@NonNull Call call, @NonNull IOException e) {
        // 请求失败,处理异常(比如打印日志)
        e.printStackTrace();
    }

    @Override
    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
        if (response.isSuccessful()) {
            // 获取API返回的字符串数据
            String responseData = response.body().string();
            // 这里可以继续解析数据并存储到数据库
            parseAndSaveData(responseData);
        }
    }
});

3. 解析JSON数据

API返回的通常是JSON格式,你可以用Gson库简化解析:
先添加Gson依赖:

implementation 'com.google.code.gson:gson:2.10.1'

然后定义数据模型类,比如API返回的用户数据:

public class User {
    private int id;
    private String name;
    private String email;

    // 生成getter、setter方法,初学者也可以直接用public字段
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

在onResponse中解析:

User user = new Gson().fromJson(responseData, User.class);

二、存储到移动端数据库(使用Room框架)

Room是Android官方推荐的SQLite封装库,比直接操作SQLite更简单,适合初学者:

1. 添加Room依赖

在Module级build.gradle中添加:

implementation "androidx.room:room-runtime:2.6.1"
annotationProcessor "androidx.room:room-compiler:2.6.1"

2. 定义实体类(对应数据库表)

用@Entity注解标记,每个字段对应表的列:

import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = false) // 用API返回的id作为主键,不自动生成
    private int id;
    private String name;
    private String email;

    // 构造方法
    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // 必须提供所有字段的getter方法,Room需要访问它们
    public int getId() { return id; }
    public String getName() { return name; }
    public String getEmail() { return email; }
}

3. 创建Dao(数据访问对象)

定义数据库操作的接口,Room会自动实现它:

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;

@Dao
public interface UserDao {
    // 插入单个用户,重复时替换原有数据
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertUser(User user);
}

4. 创建Room数据库类

这是数据库的入口,必须是抽象类:

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import android.content.Context;

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    // 获取Dao实例
    public abstract UserDao userDao();

    // 单例模式,避免重复创建数据库实例
    private static AppDatabase INSTANCE;
    public static AppDatabase getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            AppDatabase.class, "app_database")
                    .build();
        }
        return INSTANCE;
    }
}

5. 将解析后的数据插入数据库

注意:数据库操作也不能在主线程,这里用AsyncTask(适合初学者理解):

// 假设已经解析得到User对象user
AppDatabase db = AppDatabase.getInstance(getApplicationContext());
new AsyncTask<User, Void, Void>() {
    @Override
    protected Void doInBackground(User... users) {
        db.userDao().insertUser(users[0]);
        return null;
    }
}.execute(user);

关键注意事项

  • 网络权限:在AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET" />,否则无法发起网络请求。
  • 线程规则:网络请求和数据库操作都必须在子线程执行,否则会抛出异常。
  • 版本更新:如果后续修改实体类,需要更新Room数据库的版本号并处理迁移(初学者可以先临时用fallbackToDestructiveMigration(),但正式项目不推荐)。

内容的提问来源于stack exchange,提问作者Krishnendu S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:54:22