如何用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
相关产品推荐
相关产品推荐

