在安卓中操作SQLite数据库通常需要以下步骤:
继承SQLiteOpenHelper
创建自定义类继承SQLiteOpenHelper
,用于管理数据库创建与升级逻辑。
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表语句 db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级表逻辑 db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
获取数据库实例
通过getWritableDatabase()
或getReadableDatabase()
获取可写/只读数据库对象。
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 自动创建/打开数据库
操作类型 | 方法示例 | 说明 |
---|---|---|
插入 | db.insert("users", null, contentValues) |
ContentValues 存储键值对 |
查询 | db.query("users", columns, selection, args) |
返回Cursor 游标 |
更新 | db.update("users", contentValues, "id=?", args) |
影响行数返回int |
删除 | db.delete("users", "id=?", args) |
影响行数返回int |
// 插入数据 ContentValues values = new ContentValues(); values.put("name", "Alice"); long rowId = db.insert("users", null, values); // 查询数据 Cursor cursor = db.query("users", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("DB", "ID: " + id + ", Name: " + name); } while (cursor.moveToNext()); } cursor.close();
Device File Explorer
路径:/data/data/包名/databases/
.db
文件拖到电脑,用sqlite3
或图形化工具(如DB Browser)打开。Stetho调试工具
集成Stetho库后,通过Chrome浏览器访问http://localhost:8080/
,在Database
标签页实时查看数据。
库名 | 用途 | 特点 |
---|---|---|
Room | 抽象SQLite操作 | 编译时校验,支持LiveData |
GreenDao | ORM框架 | 高性能,支持复杂查询 |
Realm | 跨平台数据库 | 支持多线程,数据模型更灵活 |
问题描述 | 解决方案 |
---|---|
主线程操作数据库导致卡顿 | 使用AsyncTask 或ExecutorService 在子线程执行数据库操作。 |
数据库文件找不到 | 检查SQLiteOpenHelper 的DATABASE_NAME 是否正确,确保应用有写入存储权限。 |
表结构变更导致崩溃 | 在onUpgrade() 中处理表结构迁移,或增加VERSION 触发升级逻辑。 |
// 实体类 @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; } // DAO接口 @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM users WHERE id = :userId") User getUserById(int userId); } // 数据库类 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }