上一篇
安卓开发中数据库的连接
- 行业动态
- 2025-04-23
- 8
安卓数据库连接分本地与远程:本地用SQLite/Room,远程需HTTP请求,注意异步操作(如协程/AsyncTask)及权限配置,网络数据库需添加INTERNET权限,Room提供编译时校验更高效
安卓开发中常见的数据库类型
安卓开发中主要涉及两种类型的数据库:本地数据库和远程数据库,以下是常见的数据库类型及其特点:
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,Android 内置支持,无需额外依赖。 | 本地数据存储(如用户配置、缓存数据) |
Room | 基于 SQLite 的抽象层,提供更简洁的 API 和编译时校验。 | 需要结构化数据存储且追求代码规范性的场景 |
Firebase | Google 提供的云数据库服务,支持实时同步和离线数据。 | 需要云端数据同步的应用(如社交、协作工具) |
MySQL/PostgreSQL | 传统关系型数据库,需通过后端服务(如 Web API)连接。 | 需要与服务器端共享数据的应用 |
本地数据库连接与操作
SQLite 直接操作
步骤:
- 创建
SQLiteOpenHelper
子类,管理数据库创建与升级。 - 通过
SQLiteDatabase
对象执行增删改查操作。 - 关闭数据库连接。
代码示例:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级表逻辑 db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
使用示例:
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 插入数据 db.execSQL("INSERT INTO users (name) VALUES (?)", new Object[]{"Alice"}); // 查询数据 Cursor cursor = db.rawQuery("SELECT FROM users", null); // 关闭连接 db.close();
使用 Room 框架
优势:
- 编译时校验 SQL 语句。
- 自动生成
DAO
实现类。 - 支持 LiveData 和 RxJava 响应式编程。
代码示例:
// 定义实体类 @Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } // 定义 DAO @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") LiveData<List<User>> getAllUsers(); } // 定义数据库 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } // 使用示例 AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_data.db").build(); UserDao userDao = db.userDao(); userDao.insert(new User(0, "Alice")); LiveData<List<User>> users = userDao.getAllUsers();
远程数据库连接
通过 Retrofit + Web API 连接 MySQL/PostgreSQL
步骤:
- 后端提供 RESTful API 接口。
- 前端使用 Retrofit 发送 HTTP 请求。
- 处理返回的 JSON 数据。
代码示例:
// 定义 API 接口 public interface ApiService { @GET("users") Call<List<User>> getUsers(); } // 使用 Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 异步请求 apiService.getUsers().enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { List<User> users = response.body(); // 处理数据 } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理错误 } });
使用 Firebase Realtime Database
步骤:
- 在 Firebase 控制台创建项目并获取配置文件。
- 添加依赖并初始化 Firebase。
- 通过
DatabaseReference
操作数据。
代码示例:
// 添加依赖(build.gradle) implementation 'com.google.firebase:firebase-database:20.1.0' // 初始化 Firebase FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("users"); // 写入数据 User user = new User(1, "Alice"); ref.child(String.valueOf(user.id)).setValue(user); // 读取数据 ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { User user = snapshot.getValue(User.class); // 处理数据 } } @Override public void onCancelled(DatabaseError error) { // 处理错误 } });
常见问题与解决方案
问题 | 解决方案 |
---|---|
主线程操作数据库导致卡顿 | 使用异步任务(如 AsyncTask 、ExecutorService )或 Room 的异步 API。 |
数据库升级失败 | 在 onUpgrade 方法中正确处理表结构变更(如 ALTER TABLE 或数据迁移)。 |
远程数据库连接超时 | 检查网络权限、后端 API 地址,使用 OkHttp 拦截器设置超时时间。 |
相关问题与解答
问题1:如何选择本地数据库(SQLite)与 Room?
解答:
- 如果项目简单且对编译时校验无需求,可直接使用 SQLite。
- 如果追求代码规范性、减少重复代码,或需要响应式编程(如 LiveData),优先选择 Room。
- Room 是 SQLite 的封装,底层仍依赖 SQLite,但提供了更高层次的抽象。
问题2:如何保证远程数据库操作的安全性?
解答:
- 身份验证:使用 OAuth、JWT 等机制验证用户身份。
- 数据传输加密:通过 HTTPS 传输数据,避免明文传输。
- 权限控制:后端 API 需校验用户权限,避免越权操作(如普通用户不能修改管理员数据)。
- 数据校验:前端和后端均需对输入数据进行校验,防止 SQL 注入或反面