当前位置:首页 > 行业动态 > 正文

安卓开发怎么调用数据库

安卓开发调用数据库的常见方式

SQLite(本地轻量级数据库)

SQLite 是 Android 内置的嵌入式数据库,适合存储本地数据(如用户设置、缓存等)。

核心步骤:

  1. 配置权限
    AndroidManifest.xml 中添加权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. 创建 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);
        }
    }
  3. 执行增删改查操作

    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 抽象层,简化了数据库操作并支持编译时校验。

安卓开发怎么调用数据库  第1张

核心步骤:

  1. 添加依赖
    build.gradle 中添加:

    implementation "androidx.room:room-runtime:2.5.1"
    annotationProcessor "androidx.room:room-compiler:2.5.1"
  2. 定义实体类

    @Entity(tableName = "users")
    public class User {
        @PrimaryKey(autoGenerate = true)
        public int id;
        @ColumnInfo(name = "name")
        public String name;
    }
  3. 创建 DAO 接口

    @Dao
    public interface UserDao {
        @Insert
        void insert(User user);
        @Query("SELECT  FROM users")
        List<User> getAllUsers();
    }
  4. 创建数据库类

    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
  5. 使用数据库

    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 等网络库。

核心步骤:

  1. 定义 API 接口

    public interface ApiService {
        @GET("/users")
        Call<List<User>> getUsers();
    }
  2. 使用 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 等
0