Android SQLite 数据库
SQLite 是 Android 内置的轻量级关系型数据库,具有以下特点:
- 小巧高效:无需单独安装,占用资源少。
- 嵌入式数据库:数据存储在应用私有文件夹中。
- 支持 SQL 语法:可以使用标准 SQL 对数据库进行操作。
- 开箱即用:Android 提供了对 SQLite 的完整支持。
SQLite 数据库核心类
在 Android 中,操作 SQLite 数据库主要依赖以下核心类:
-
SQLiteDatabase- 提供了操作 SQLite 数据库的 API,支持增删改查操作。
- 可通过
openOrCreateDatabase()方法打开数据库,或者使用SQLiteOpenHelper类来管理。
-
SQLiteOpenHelper- 用于管理数据库的创建和版本控制。
- 提供了便捷的方法来升级数据库和执行初始化操作。
-
Cursor- 用于查询结果的迭代和访问。
- 包含查询数据的结果集,可通过
moveToFirst()、moveToNext()遍历数据。
SQLite 使用流程
1. 创建数据库
使用 SQLiteOpenHelper 创建和管理数据库:
java
复制代码
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyDatabase.db"; // 数据库名称
private static final int DATABASE_VERSION = 1; // 数据库版本
// 创建表的 SQL 语句
private static final String CREATE_TABLE = "CREATE TABLE user ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "name TEXT, "
+ "age INTEGER)";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建表
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级
db.execSQL("DROP TABLE IF EXISTS user");
onCreate(db);
}
}
2. 打开数据库
通过 SQLiteOpenHelper 的实例获取数据库对象:
java
复制代码
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase(); // 可写数据库
3. 数据库操作
插入数据
java
复制代码
ContentValues values = new ContentValues();
values.put("name", "John");
values.put("age", 25);
db.insert("user", null, values); // 插入数据
更新数据
java
复制代码
ContentValues values = new ContentValues();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"John"}); // 更新数据
查询数据
java
复制代码
Cursor cursor = db.query("user", null, "name = ?", new String[]{"John"}, null, null, null);
if (cursor.moveToFirst()) {
int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
Log.d("SQLite", "Name: " + name + ", Age: " + age);
}
cursor.close();
删除数据
java
复制代码
db.delete("user", "name = ?", new String[]{"John"}); // 删除数据
4. 关闭数据库
用完数据库后,需要关闭数据库和游标以释放资源:
java
复制代码
cursor.close();
db.close();
SQLiteOpenHelper 的方法
onCreate():首次创建数据库时调用,通常用于初始化数据库表结构。onUpgrade():当数据库版本升级时调用,用于更新表结构或迁移数据。getReadableDatabase():获取可读数据库对象。getWritableDatabase():获取可写数据库对象。
SQLite 数据类型
SQLite 支持以下数据类型:
NULL:空值。INTEGER:整数。REAL:浮点数。TEXT:字符串。BLOB:二进制数据。
在 SQLite 中,数据类型是弱类型的,不严格校验数据类型,例如可以将整数存储到 TEXT 类型的列中。
SQLite 注意事项
-
数据库文件存储路径:
SQLite 数据库文件默认存储在应用的私有目录下:
/data/data/<package_name>/databases/<database_name> -
事务操作:
使用事务可以确保操作的原子性。java 复制代码 db.beginTransaction(); try { // 执行多条 SQL 语句 db.setTransactionSuccessful(); // 标记事务成功 } finally { db.endTransaction(); } -
性能优化:
- 使用事务:减少 IO 操作的次数。
- 避免频繁打开和关闭数据库。
- 尽量使用批量操作。
-
多线程访问:
- SQLite 是线程安全的,但需要使用同一个数据库连接。
- 避免多个线程同时访问同一个数据库对象。
完整示例
以下是一个增删改查的完整示例:
java
复制代码
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this);
// 插入数据
insertData();
// 查询数据
queryData();
// 更新数据
updateData();
// 删除数据
deleteData();
}
private void insertData() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "Alice");
values.put("age", 23);
db.insert("user", null, values);
}
private void queryData() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("user", null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));
Log.d("SQLite", "Name: " + name + ", Age: " + age);
}
cursor.close();
}
private void updateData() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 24);
db.update("user", values, "name = ?", new String[]{"Alice"});
}
private void deleteData() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("user", "name = ?", new String[]{"Alice"});
}
}
SQLite 的替代方案
虽然 SQLite 是 Android 的内置数据库,但在某些场景下,其他数据库框架可能更适合:
-
Room:
- Google 推荐的持久化库,基于 SQLite 构建,简化了数据库操作。
- 提供了强大的注解支持和类型安全。
-
Realm:
- 跨平台数据库,性能更高,易用性强,支持实时数据更新。
-
GreenDAO 和 ORMLite:
- 第三方 ORM 框架,简化数据库操作。
总结
SQLite 是 Android 中强大的内置数据库,适用于大多数本地存储场景。通过 SQLiteOpenHelper,开发者可以轻松创建和管理数据库。但在复杂场景下,Google 推荐使用 Room 来提升开发效率和代码可维护性