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();
加密数据库
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的单例模式管理。