Android数据库操作全攻略:从入门到精通,解决开发中的常见问题

文章导读
SQLiteDatabase db = openOrCreateDatabase("mydb.db", MODE_PRIVATE, null); db.execSQL("CREATE TABLE IF NOT EXISTS users (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); ContentValues v
📋 目录
  1. SQLite入门基础
  2. 常用CRUD操作
  3. Room数据库组件
  4. 常见问题解决
  5. 使用SharedPreferences存储简单数据
  6. 加密数据库
A A

SQLiteDatabase db = openOrCreateDatabase("mydb.db", MODE_PRIVATE, null); db.execSQL("CREATE TABLE IF NOT EXISTS users (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("users", null, values); Cursor cursor = db.query("users", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } while (cursor.moveToNext()); } cursor.close(); db.close();

SQLite入门基础

Android开发中,SQLite是最常用的本地数据库。它轻量级、无服务器需求,直接嵌入应用。使用SQLiteOpenHelper类管理数据库创建和版本升级。在onCreate方法中定义表结构,在onUpgrade中处理版本变更。

常用CRUD操作

插入数据:使用insert方法或execSQL("INSERT INTO table VALUES(...)"); 查询:query方法返回Cursor,记得close。更新:update(table, values, where, args)。删除:delete(table, where, args)。事务处理用db.beginTransaction()和db.setTransactionSuccessful()确保原子性。

Room数据库组件

Room是Android Jetpack的ORM库,简化SQLite操作。定义@Entity注解的实体类,@Dao接口定义查询方法,@Database注解的类管理数据库。自动生成代码,支持LiveData和RxJava响应式查询,避免Cursor泄漏。

@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; public int age; } @Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Insert void insert(User user); }

常见问题解决

数据库锁问题:使用try-catch捕获SQLiteDatabaseLockedException,避免多线程并发写。版本升级:onUpgrade中DROP旧表再CREATE新表,或用ALTER TABLE添加字段。Cursor内存泄漏:始终在finally块close Cursor。性能优化:用索引加速查询,批量插入用事务。

使用SharedPreferences存储简单数据

对于键值对,优先用SharedPreferences代替数据库。getSharedPreferences("prefs", MODE_PRIVATE).edit().putString("key", "value").apply();

Android数据库操作全攻略:从入门到精通,解决开发中的常见问题

加密数据库

SQLCipher库支持加密SQLite。集成后用数据库密码打开:SQLiteDatabase.openOrCreateDatabase(file, password, null);

Q: Android中数据库查询返回空数据怎么办?
A: 检查表名、列名拼写,where条件是否过滤所有数据,用Log打印SQL验证。

Q: 如何处理数据库升级时的字段变更?
A: 在SQLiteOpenHelper的onUpgrade中,用ALTER TABLE ADD COLUMN,或重建表迁移数据。

Q: Room和原生SQLite哪个更好?
A: Room更现代,类型安全,少 boilerplate代码,推荐新项目使用。

Q: 数据库多线程安全吗?
A: SQLite支持WAL模式多读,但写需单线程,用ContentProvider或Room的单例模式管理。