上一篇
安卓开发之用数据库的增删改查
- 行业动态
- 2025-04-22
- 4
环境搭建与准备
在安卓中使用SQLite数据库,需通过SQLiteOpenHelper
管理数据库创建与版本控制。
添加依赖
无需额外依赖,android.database.sqlite
包已内置支持。
创建数据库帮助类
public class DBHelper extends SQLiteOpenHelper { private static final String NAME = "app.db"; // 数据库名称 private static final int VERSION = 1; // 版本号 public DBHelper(Context context) { super(context, NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表(users表) String sql = "CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑(删除旧表并创建新表) db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
增删改查操作实现
增(Insert)
SQL语句: INSERT INTO table_name (column1, column2) VALUES (?, ?)
代码示例:
DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 获取可写数据库 ContentValues values = new ContentValues(); values.put("name", "Alice"); values.put("age", 25); long rowId = db.insert("users", null, values); // 插入数据 db.close();
删(Delete)
SQL语句: DELETE FROM table_name WHERE condition
代码示例:
DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); int affected = db.delete("users", "age > ?", new String[]{"30"}); // 删除年龄大于30的记录 db.close();
改(Update)
SQL语句: UPDATE table_name SET column1 = ? WHERE condition
代码示例:
DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("age", 26); int affected = db.update("users", values, "name = ?", new String[]{"Alice"}); // 更新Alice的年龄 db.close();
查(Select)
SQL语句: SELECT FROM table_name WHERE condition
代码示例:
DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getReadableDatabase(); // 获取只读数据库 Cursor cursor = db.rawQuery("SELECT FROM users WHERE age < ?", new String[]{"30"}); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); // 处理数据... } cursor.close(); db.close();
常用操作对比表
操作类型 | SQL语句示例 | 关键API方法 | 适用场景 |
---|---|---|---|
增 | INSERT INTO users (name) VALUES (?) |
insert() |
添加新数据 |
删 | DELETE FROM users WHERE id = ? |
delete() |
删除指定条件数据 |
改 | UPDATE users SET age = ? WHERE name = ? |
update() |
更新符合条件的数据 |
查 | SELECT FROM users |
rawQuery() 或query() |
读取数据 |
注意事项
线程安全:
SQLiteDatabase实例非线程安全,建议每个线程独立获取数据库实例,或通过synchronized
同步访问。数据库升级:
修改表结构时需更新VERSION
,并在onUpgrade()
中处理数据迁移逻辑。防止SQL注入:
使用参数化查询(如占位符),避免直接拼接字符串。
问题与解答
问题1:如何迁移数据库表结构?
解答:
- 增加
VERSION
版本号(如从1改为2)。 - 在
onUpgrade()
中执行迁移逻辑,db.execSQL("ALTER TABLE users ADD COLUMN email TEXT"); // 添加新列
- 重新运行应用,系统会自动调用
onUpgrade()
。
问题2:能否使用第三方库简化操作?
解答:
可以使用Room
持久化库,它提供编译时校验和抽象层,简化SQLite操作。
@Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; public int age; }