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

安卓开发如何连数据库

安卓连接数据库的常见方案

本地数据库(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:连接远程数据库时如何避免网络异常?

解答

  1. 异步处理:使用 AsyncTaskRxJavaCoroutine 避免阻塞主线程。
  2. 超时设置:为 HTTP 请求设置连接/读取超时(如 Retrofit 的 OkHttpClient)。
  3. 重试机制:对网络请求失败时进行指数退避重试。
  4. SSL 加密:远程连接必须使用 HTTPS,避免明文传输敏感数据