上一篇
安卓开发如何连数据库
- 行业动态
- 2025-04-22
- 7
安卓连接数据库的常见方案
本地数据库(SQLite)
SQLite 是安卓内置的轻量级数据库,适合存储本地数据。
创建数据库和表
// 创建数据库帮助类 public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { super(context, "mydb.db", null, 1); // 数据库名称和版本号 } @Override public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 } }
增删改查操作
// 插入数据 SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("INSERT INTO user (name) VALUES (?)", new String[]{"Alice"}); // 查询数据 Cursor cursor = db.rawQuery("SELECT FROM user", null); while (cursor.moveToNext()) { int id = cursor.getInt(0); String name = cursor.getString(1); } cursor.close();
推荐使用 Room 库
Room 是谷歌提供的 SQLite 抽象层,简化开发流程。
// 定义实体 @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") List<User> getAll(); } // 使用 Room 数据库 AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app-db").build(); UserDao userDao = db.userDao();
远程数据库(如 MySQL/PostgreSQL)
通过 JDBC 或 HTTP API 连接远程数据库,需处理网络线程和安全认证。
使用 JDBC 直连(不推荐生产环境)
// 添加依赖(需手动添加 JDBC 驱动) implementation 'mysql:mysql-connector-java:8.0.23' // 连接数据库 Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://服务器地址:3306/数据库名?useSSL=false", "用户名", "密码" ); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT FROM user");
推荐通过 Web API 间接操作
// Retrofit + Web API 示例 public interface ApiService { @GET("users") Call<List<User>> getUsers(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://yourserver.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService api = retrofit.create(ApiService.class); api.getUsers().enqueue(new Callback<>() { ... });
云数据库(如 Firebase Realtime Database)
无需自建服务器,适合快速集成。
配置 Firebase
- 在 Firebase 控制台创建项目
- 下载
google-services.json
文件并放入app/
目录 - 修改
build.gradle
:implementation 'com.google.firebase:firebase-database:20.0.5' apply plugin: 'com.google.gms.google-services'
读写数据
// 初始化 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("users"); // 写入数据 User user = new User("Bob", 25); ref.push().setValue(user); // 生成唯一 ID // 读取数据 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) {} });
方案对比表
方案 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
SQLite | 本地数据存储 | 轻量、无需网络 | 不适合多设备同步 |
远程数据库(JDBC) | 需要直接操作数据库 | 灵活控制 | 需处理线程、安全性差 |
远程数据库(API) | 前后端分离架构 | 安全、可扩展 | 需搭建后端服务 |
Firebase | 快速原型、实时同步 | 集成简单、实时更新 | 受限于 Firebase 规则 |
相关问题与解答
问题1:如何选择本地数据库和远程数据库?
解答:
- 本地数据库(SQLite/Room):适合存储敏感数据(如登录凭证)、离线数据或轻量级应用。
- 远程数据库:适合需要多设备同步、大规模数据存储或复杂查询的场景,若需实时同步,优先选择云数据库(如 Firebase)。
问题2:连接远程数据库时如何避免网络异常?
解答:
- 异步处理:使用
AsyncTask
、RxJava
或Coroutine
避免阻塞主线程。 - 超时设置:为 HTTP 请求设置连接/读取超时(如 Retrofit 的
OkHttpClient
)。 - 重试机制:对网络请求失败时进行指数退避重试。
- SSL 加密:远程连接必须使用 HTTPS,避免明文传输敏感数据