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),需通过网络请求或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与服务器交互,避免直接操作数据库连接。
单例模式管理数据库对象
避免频繁创建/销毁连接,提高性能:
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; } }
在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(); } }
解答:
在完成数据库操作后,必须调用 db.close()
释放资源,若使用try-finally
结构可确保连接关闭:
SQLiteDatabase db = null; try { db = dbHelper.getWritableDatabase(); // 执行数据库操作 } catch (Exception e) { e.printStackTrace(); } finally { if (db != null && db.isOpen()) { db.close(); // 确保连接关闭 } }
解答:
public synchronized void insertData(String name) { SQLiteDatabase db = dbHelper.getWritableDatabase(); // 执行插入操作 db.close(); }
ContentProvider
:ContentProvider
统一管理数据操作,天然支持进程间通信和权限