想象你正在开发一个待办事项应用,用户添加了几十条任务后,突然关闭应用重新打开——如果这些数据没有保存,用户肯定会抓狂!这就是数据库发挥作用的地方,在安卓开发中,合理使用数据库能让你的应用记住用户的重要信息,即使应用关闭或手机重启也不会丢失。
在安卓中,我们有几种存储数据的选择:
今天我们就重点聊聊SQLite和Room这两种数据库操作方法。
我们需要继承SQLiteOpenHelper
类:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "MyApp.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL("CREATE TABLE tasks (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " + "description TEXT, " + "due_date TEXT);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库时执行 db.execSQL("DROP TABLE IF EXISTS tasks"); onCreate(db); } }
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("title", "完成数据库教程"); values.put("description", "学习安卓数据库操作"); values.put("due_date", "2025-08-20"); long newRowId = db.insert("tasks", null, values);
SQLiteDatabase db = dbHelper.getReadableDatabase(); String[] projection = {"_id", "title", "due_date"}; String selection = "due_date = ?"; String[] selectionArgs = {"2025-08-20"}; Cursor cursor = db.query( "tasks", projection, selection, selectionArgs, null, null, "due_date DESC" ); List<String> tasks = new ArrayList<>(); while(cursor.moveToNext()) { String title = cursor.getString(cursor.getColumnIndexOrThrow("title")); tasks.add(title); } cursor.close();
SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("due_date", "2025-08-25"); String selection = "title = ?"; String[] selectionArgs = {"完成数据库教程"}; int count = db.update( "tasks", values, selection, selectionArgs );
SQLiteDatabase db = dbHelper.getWritableDatabase(); String selection = "due_date < ?"; String[] selectionArgs = {"2025-08-01"}; int deletedRows = db.delete("tasks", selection, selectionArgs);
Room是Google推荐的数据库解决方案,它简化了SQLite的操作,提供了编译时检查。
首先在build.gradle中添加:
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // 如果使用Kotlin,使用kapt替代annotationProcessor }
@Entity(tableName = "tasks") public class Task { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "title") public String title; @ColumnInfo(name = "description") public String description; @ColumnInfo(name = "due_date") public String dueDate; }
@Dao public interface TaskDao { @Insert void insert(Task task); @Update void update(Task task); @Delete void delete(Task task); @Query("SELECT * FROM tasks") List<Task> getAllTasks(); @Query("SELECT * FROM tasks WHERE due_date = :date") List<Task> getTasksByDate(String date); }
@Database(entities = {Task.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract TaskDao taskDao(); private static volatile AppDatabase INSTANCE; public static AppDatabase getDatabase(final Context context) { if (INSTANCE == null) { synchronized (AppDatabase.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder( context.getApplicationContext(), AppDatabase.class, "app_database" ).build(); } } } return INSTANCE; } }
// 获取数据库实例 AppDatabase db = AppDatabase.getDatabase(context); // 插入数据 Task newTask = new Task(); newTask.title = "学习Room数据库"; newTask.dueDate = "2025-08-20"; db.taskDao().insert(newTask); // 查询数据 List<Task> todayTasks = db.taskDao().getTasksByDate("2025-08-20"); for (Task task : todayTasks) { Log.d("Task", task.title); }
不要在主线程执行数据库操作:这会导致应用卡顿甚至ANR错误,使用AsyncTask、RxJava或协程。
使用事务处理批量操作:可以显著提高性能。
db.beginTransaction(); try { // 执行多个操作 db.insert(...); db.update(...); db.setTransactionSuccessful(); } finally { db.endTransaction(); }
合理设计数据库结构:避免过度规范化或反规范化。
定期备份重要数据:考虑实现导出/导入功能。
考虑数据迁移策略:当数据结构变化时,需要正确处理版本升级。
Q:SQLite和Room有什么区别? A:Room是SQLite的封装,提供了更简洁的API、编译时检查和与LiveData等架构组件的集成。
Q:数据库文件存储在哪里? A:默认在/data/data/<包名>/databases/目录下,应用卸载时会自动删除。
Q:如何查看数据库内容? A:可以使用Android Studio的Database Inspector工具,或者将数据库文件导出到电脑上用SQLite浏览器查看。
掌握安卓数据库操作是开发数据驱动型应用的基础,从简单的SQLite直接操作到现代化的Room数据库,选择适合你项目需求的方案,良好的数据管理不仅能提升应用性能,还能为用户提供更流畅的体验,现在就去试试这些方法,让你的应用记住用户的每一个重要信息吧!
本文由 归嘉良 于2025-08-02发表在【云服务器提供商】,文中图片由(归嘉良)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/519930.html
发表评论