18 数据存储之Room数据库

在安卓应用开发中,数据存储是一个至关重要的部分。继上一次讨论的文件存储之后,本章将重点介绍Room数据库,它是Android官方提供的一个持久化库,简化了SQLite数据库的使用,以便于开发者进行数据的存储和管理。

Room的概述

RoomAndroid Architecture Components中的一部分,提供了一个抽象层,使得SQLite数据库的使用更加简单、直观。使用Room,您可以通过对象关系映射(ORM)来操作数据库,无需直接处理复杂的SQL语句。

Room的优势

  • 简化数据库操作: 自动生成SQLite查询代码,无需手动编写SQL。
  • 支持数据模型的变化: 通过注解版本管理数据模型的变化。
  • 即时查询和强类型安全: 提供编译时检查,减少运行时错误。

创建Room数据库的步骤

创建一个Room数据库主要包括以下几个步骤:

  1. 定义数据实体(Entity)
  2. 创建数据访问对象(DAO)
  3. 构建数据库(Database)

1. 定义数据实体

数据实体是数据库中表的表示。我们使用@Entity注解来定义一个数据实体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "user")
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private String email;

public User(String name, String email) {
this.name = name;
this.email = email;
}

// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public String getEmail() { return email; }
}

2. 创建数据访问对象(DAO)

DAO定义了对数据库的操作接口,使用@Dao注解,将 SQL 查询方法定义在接口中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface UserDao {
@Insert
void insert(User user);

@Query("SELECT * FROM user")
List<User> getAllUsers();
}

3. 构建数据库

最后,我们需要创建数据库类,使用@Database注解来定义整个数据库,指定实体和版本号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import android.content.Context;

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();

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;
}
}

使用Room数据库

在应用中使用Room数据库的流程通常包括初始化数据库、插入数据和查询数据。下面的示例展示了如何在Activity中使用它。

示例:在MainActivity中使用Room

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private UserViewModel userViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

userViewModel = new ViewModelProvider(this).get(UserViewModel.class);

// 插入用户数据
userViewModel.insert(new User("张三", "zhangsan@example.com"));

// 查询并观察用户数据
userViewModel.getAllUsers().observe(this, new Observer<List<User>>() {
@Override
public void onChanged(List<User> users) {
// 更新UI显示
for (User user : users) {
System.out.println(user.getName());
}
}
});
}
}

在此示例中,我们通过UserViewModel类将Room和UI组件解耦,从而确保数据的持久性和实时更新。

UserViewModel类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import java.util.List;

public class UserViewModel extends ViewModel {
private UserDao userDao;
private LiveData<List<User>> allUsers;

public UserViewModel(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
userDao = db.userDao();
allUsers = userDao.getAllUsers();
}

LiveData<List<User>> getAllUsers() {
return allUsers;
}

void insert(User user) {
userDao.insert(user);
}
}

总结

本章介绍了如何使用Room数据库进行数据存储,涵盖了Room的基本概念、创建数据库的步骤,以及如何在应用中进行数据的插入与查询。Room大大简化了开发者使用数据库的流程,使得开发更加高效。

在下一章中,我们将继续探讨网络访问之Http请求,学习如何通过网络获取和存储数据。

18 数据存储之Room数据库

https://zglg.work/android-app-dev/18/

作者

IT教程网(郭震)

发布于

2024-08-14

更新于

2024-08-15

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论