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

安卓开发创建数据库连接

安卓开发中创建数据库连接的实现方式

本地数据库(SQLite)

SQLite 是安卓内置的轻量级数据库,无需额外依赖,适合存储少量结构化数据。

创建数据库帮助类

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app.db";
    private static final int DATABASE_VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表
        String sql = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 更新表逻辑
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}

增删改查操作

// 插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
database.insert("users", null, values);
// 查询数据
Cursor cursor = database.query("users", null, null, null, null, null, null);
while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();

使用 Room 持久化库(推荐)

Room 是谷歌提供的抽象层,简化了 SQLite 操作并支持 LiveData。

定义实体类

@Entity(tableName = "users")
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 users")
    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.db").build();
UserDao userDao = db.userDao();
userDao.insert(new User(0, "李四"));
userDao.getAllUsers().observe(lifecycleOwner, users -> {
    // 实时更新 UI
});

远程数据库连接(如 MySQL)

需通过 JDBC 或第三方库(如 Retrofit + Web API)连接远程数据库。

添加权限

<uses-permission android:name="android.permission.INTERNET" />

使用 JDBC 连接 MySQL

// 注意:直接在主线程操作会导致 ANR,需使用异步任务
new Thread(() -> {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://服务器地址:3306/数据库名";
        Connection conn = DriverManager.getConnection(url, "用户名", "密码");
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT  FROM users");
        while (rs.next()) {
            // 处理数据
        }
        rs.close();
        stmt.close();
        conn.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();

云数据库(如 Firebase Firestore)

适合快速集成,无需维护服务器。

添加依赖

implementation 'com.google.firebase:firebase-firestore:24.0.0'

初始化并操作数据

FirebaseFirestore db = FirebaseFirestore.getInstance();
// 添加数据
Map<String, Object> user = new HashMap<>();
user.put("name", "王五");
db.collection("users").add(user);
// 实时监听数据
db.collection("users").addSnapshotListener((value, error) -> {
    if (error != null) return;
    for (DocumentSnapshot doc : value.getDocuments()) {
        String name = doc.getString("name");
    }
});

数据库类型对比表

特性 SQLite(本地) Room(本地) MySQL(远程) Firestore(云)
适用场景 轻量级存储 复杂本地逻辑 多设备同步 实时云端数据
网络依赖 需要 需要
学习成本 中等 低(封装好) 低(SDK 完善)
实时性 需手动实现 LiveData支持 需轮询/Socket 自动同步

常见问题与解答

问题1:为什么在主线程操作数据库会导致应用崩溃?

解答
安卓主线程(UI 线程)不允许执行耗时操作(如数据库读写、网络请求),若在主线程操作数据库,会抛出 NetworkOnMainThreadException(远程数据库)或导致 UI 卡顿(本地数据库),解决方案:

  • 本地数据库:使用 AsyncTaskExecutorService 异步处理。
  • 远程数据库:结合 Retrofit 的异步调用或 WorkManager 后台任务。

问题2:如何防止 SQLite 数据库被明文破解?

解答
SQLite 数据库文件可被 root 后的设备或模拟器直接读取,防护措施包括:

  1. 加密存储:使用 SQLCipher 库对数据库文件加密。
  2. 数据脱敏:敏感字段(如密码)存储哈希值(如 BCrypt)而非明文。
  3. 权限控制:限制应用安装到非 root 设备,并通过代码检测调试
0