上一篇
安卓开发怎么调用数据库
- 行业动态
- 2025-04-22
- 8
安卓开发调用数据库的常见方式
SQLite(本地轻量级数据库)
SQLite 是 Android 内置的嵌入式数据库,适合存储本地数据(如用户设置、缓存等)。
核心步骤:
配置权限
在AndroidManifest.xml
中添加权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
创建 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); } }
执行增删改查操作
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); db.insert("users", null, values); // 查询数据 Cursor cursor = db.query("users", null, null, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("DB", "用户姓名: " + name); } cursor.close();
Room(基于 SQLite 的高级框架)
Room 是 Google 提供的 SQLite 抽象层,简化了数据库操作并支持编译时校验。
核心步骤:
添加依赖
在build.gradle
中添加:implementation "androidx.room:room-runtime:2.5.1" annotationProcessor "androidx.room:room-compiler:2.5.1"
定义实体类
@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") List<User> getAllUsers(); }
创建数据库类
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
使用数据库
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_data.db").build(); UserDao userDao = db.userDao(); // 插入数据 User user = new User(); user.name = "李四"; userDao.insert(user); // 查询数据 List<User> users = userDao.getAllUsers();
网络数据库(如 MySQL)
通常通过 HTTP 接口与远程服务器交互,而非直接连接数据库,需结合 Retrofit、OkHttp 等网络库。
核心步骤:
定义 API 接口
public interface ApiService { @GET("/users") Call<List<User>> getUsers(); }
使用 Retrofit 发起请求
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 异步请求 apiService.getUsers().enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { List<User> users = response.body(); // 处理数据 } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理错误 } });
数据库方案对比表
特性 | SQLite | Room | 网络数据库(MySQL) |
---|---|---|---|
适用场景 | 本地轻量级存储 | 复杂本地存储与编译时校验 | 远程数据持久化 |
操作复杂度 | 高(需手动管理 SQL) | 低(面向对象) | 依赖网络与 API 设计 |
性能 | 高(本地文件系统) | 略低于 SQLite(封装层开销) | 依赖网络延迟 |
维护成本 | 中等(需手动处理升级) | 低(自动迁移工具) | 高(需服务器端维护) |
常见问题与解答
问题1:如何迁移 Room 数据库版本?
解答:
在 AppDatabase
类中添加迁移策略:
Room.databaseBuilder(context, AppDatabase.class, "app_data.db") .addMigrations(new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 修改表结构,例如新增字段 database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER"); } }).build();
问题2:SQLite 和 Room 如何选择?
解答:
- 选择 SQLite:简单项目、需直接控制 SQL 或依赖第三方库(如 GreenDAO)。
- 选择 Room:复杂项目、需编译时校验、希望利用 LiveData/RxJava 等