安卓开发中主要涉及两种类型的数据库:本地数据库和远程数据库,以下是常见的数据库类型及其特点:
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,Android 内置支持,无需额外依赖。 | 本地数据存储(如用户配置、缓存数据) |
Room | 基于 SQLite 的抽象层,提供更简洁的 API 和编译时校验。 | 需要结构化数据存储且追求代码规范性的场景 |
Firebase | Google 提供的云数据库服务,支持实时同步和离线数据。 | 需要云端数据同步的应用(如社交、协作工具) |
MySQL/PostgreSQL | 传统关系型数据库,需通过后端服务(如 Web API)连接。 | 需要与服务器端共享数据的应用 |
步骤:
SQLiteOpenHelper
子类,管理数据库创建与升级。SQLiteDatabase
对象执行增删改查操作。代码示例:
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(); // 插入数据 db.execSQL("INSERT INTO users (name) VALUES (?)", new Object[]{"Alice"}); // 查询数据 Cursor cursor = db.rawQuery("SELECT FROM users", null); // 关闭连接 db.close();
优势:
DAO
实现类。代码示例:
// 定义实体类 @Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } // 定义 DAO @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") LiveData<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(); userDao.insert(new User(0, "Alice")); LiveData<List<User>> users = userDao.getAllUsers();
步骤:
代码示例:
// 定义 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) { // 处理错误 } });
步骤:
DatabaseReference
操作数据。代码示例:
// 添加依赖(build.gradle) implementation 'com.google.firebase:firebase-database:20.1.0' // 初始化 Firebase FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("users"); // 写入数据 User user = new User(1, "Alice"); ref.child(String.valueOf(user.id)).setValue(user); // 读取数据 ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { User user = snapshot.getValue(User.class); // 处理数据 } } @Override public void onCancelled(DatabaseError error) { // 处理错误 } });
问题 | 解决方案 |
---|---|
主线程操作数据库导致卡顿 | 使用异步任务(如 AsyncTask 、ExecutorService )或 Room 的异步 API。 |
数据库升级失败 | 在 onUpgrade 方法中正确处理表结构变更(如 ALTER TABLE 或数据迁移)。 |
远程数据库连接超时 | 检查网络权限、后端 API 地址,使用 OkHttp 拦截器设置超时时间。 |
解答:
解答: