上一篇
安卓开发创建数据库连接
- 行业动态
- 2025-04-22
- 3
安卓开发中创建数据库连接的实现方式
本地数据库(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 卡顿(本地数据库),解决方案:
- 本地数据库:使用
AsyncTask
或ExecutorService
异步处理。 - 远程数据库:结合
Retrofit
的异步调用或WorkManager
后台任务。
问题2:如何防止 SQLite 数据库被明文破解?
解答:
SQLite 数据库文件可被 root 后的设备或模拟器直接读取,防护措施包括:
- 加密存储:使用
SQLCipher
库对数据库文件加密。 - 数据脱敏:敏感字段(如密码)存储哈希值(如 BCrypt)而非明文。
- 权限控制:限制应用安装到非 root 设备,并通过代码检测调试