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

安卓开发如何打开数据库连接

安卓开发中打开数据库连接的实现方法

使用SQLite数据库(本地轻量级数据库)

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

创建数据库帮助类
继承 SQLiteOpenHelper 并实现抽象方法:

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app_data.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 createTable = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)";
        db.execSQL(createTable);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级逻辑(如表结构变更)
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}

打开数据库连接
通过 getWritableDatabase()getReadableDatabase() 获取连接:

安卓开发如何打开数据库连接

安卓开发如何打开数据库连接

DatabaseHelper dbHelper = new DatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase(); // 可读写连接
// 或
SQLiteDatabase db = dbHelper.getReadableDatabase(); // 只读连接
方法 作用 适用场景
getWritableDatabase() 获取可读写的数据库连接 需要插入/更新/删除数据
getReadableDatabase() 获取只读的数据库连接 仅需查询数据

关闭数据库连接
操作完成后必须关闭连接以释放资源:

db.close(); // 关闭数据库连接

使用远程数据库(如MySQL)

若需连接远程服务器上的数据库(如MySQL),需通过网络请求或ORM框架操作。

添加网络权限
AndroidManifest.xml 中声明权限:

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

通过JDBC连接(不推荐直接使用)

// 注意:直接使用JDBC可能导致主线程阻塞,需在子线程中执行
String url = "jdbc:mysql://服务器地址:3306/数据库名";
String user = "用户名";
String password = "密码";
Connection conn = DriverManager.getConnection(url, user, password);

推荐方案:使用Retrofit + Web API
通过定义RESTful API与服务器交互,避免直接操作数据库连接。


最佳实践

  1. 单例模式管理数据库对象
    避免频繁创建/销毁连接,提高性能:

    安卓开发如何打开数据库连接

    public class DatabaseHelper extends SQLiteOpenHelper {
        private static DatabaseHelper instance;
        private SQLiteDatabase db;
        private DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        public static synchronized DatabaseHelper getInstance(Context context) {
            if (instance == null) {
                instance = new DatabaseHelper(context.getApplicationContext());
            }
            return instance;
        }
        public SQLiteDatabase openDatabase() {
            if (db == null || !db.isOpen()) {
                db = instance.getWritableDatabase();
            }
            return db;
        }
    }
  2. Application类中初始化
    确保数据库生命周期与应用一致:

    public class MyApp extends Application {
        private static DatabaseHelper dbHelper;
        @Override
        public void onCreate() {
            super.onCreate();
            dbHelper = DatabaseHelper.getInstance(this);
        }
        public static SQLiteDatabase getDatabase() {
            return dbHelper.openDatabase();
        }
    }

相关问题与解答

问题1:如何安全关闭数据库连接?

解答
在完成数据库操作后,必须调用 db.close() 释放资源,若使用try-finally结构可确保连接关闭:

SQLiteDatabase db = null;
try {
    db = dbHelper.getWritableDatabase();
    // 执行数据库操作
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (db != null && db.isOpen()) {
        db.close(); // 确保连接关闭
    }
}

问题2:多线程环境下如何防止数据库并发问题?

解答

  1. 同步锁:对数据库操作加锁,保证同一时间只有一个线程访问:
    public synchronized void insertData(String name) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        // 执行插入操作
        db.close();
    }
  2. 使用ContentProvider
    通过ContentProvider统一管理数据操作,天然支持进程间通信和权限