在 Android 开发中,Room 是一个持久性库,它提供了一个抽象层来访问 SQLite 数据库。结合 ViewModel 和 LiveData,可以实现一个高效且响应式的数据层。以下是一个示例项目,展示了如何在 Android 应用中使用 Room、ViewModel 和 LiveData。
首先,在你的 build.gradle
文件中添加 Room、ViewModel 和 LiveData 的依赖:
dependencies {
def room_version = "2.4.2"
def lifecycle_version = "2.4.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}
创建一个实体类来表示数据库中的表。例如,一个简单的用户表:
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "user_table")
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
public User(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
}
创建一个 DAO 接口来定义访问数据库的方法:
import androidx.lifecycle.LiveData;
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_table")
LiveData<List<User>> getAllUsers();
}
创建一个数据库类来持有数据库并作为应用的主要访问点:
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
public abstract UserDao userDao();
private static volatile UserDatabase INSTANCE;
public static UserDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (UserDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
UserDatabase.class, "user_database")
.build();
}
}
}
return INSTANCE;
}
}
创建一个 Repository 类来管理数据操作:
import android.app.Application;
import androidx.lifecycle.LiveData;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UserRepository {
private UserDao userDao;
private LiveData<List<User>> allUsers;
private static final int NUMBER_OF_THREADS = 4;
static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public UserRepository(Application application) {
UserDatabase db = UserDatabase.getDatabase(application);
userDao = db.userDao();
allUsers = userDao.getAllUsers();
}
public LiveData<List<User>> getAllUsers() {
return allUsers;
}
public void insert(User user) {
databaseWriteExecutor.execute(() -> {
userDao.insert(user);
});
}
}
创建一个 ViewModel 类来提供数据给 UI 并且生存期比 UI 长:
import android.app.Application;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import java.util.List;
public class UserViewModel extends AndroidViewModel {
private UserRepository repository;
private LiveData<List<User>> allUsers;
public UserViewModel(Application application) {
super(application);
repository = new UserRepository(application);
allUsers = repository.getAllUsers();
}
public LiveData<List<User>> getAllUsers() {
return allUsers;
}
public void insert(User user) {
repository.insert(user);
}
}
在你的 Activity 或 Fragment 中使用 ViewModel 和 LiveData 来显示数据:
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
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);
RecyclerView recyclerView = findViewById(R.id.recyclerview);
final UserListAdapter adapter = new UserListAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
userViewModel.getAllUsers().observe(this, new Observer<List<User>>() {
@Override
public void onChanged(List<User> users) {
adapter.setUsers(users);
}
});
// Example of inserting a new user
findViewById(R.id.button_add).setOnClickListener(v -> {
User user = new User("New User");
userViewModel.insert(user);
});
}
}
创建一个 RecyclerView Adapter 来显示用户列表:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class UserListAdapter extends RecyclerView.Adapter<UserListAdapter.UserViewHolder> {
private final LayoutInflater mInflater;
private List<User> mUsers;
UserListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false);
return new UserViewHolder(itemView);
}
@Override
public void onBindViewHolder(UserViewHolder holder, int position) {
if (mUsers != null) {
User current = mUsers.get(position);
holder.userItemView.setText(current.getName());
} else {
holder.userItemView.setText("No User");
}
}
void setUsers(List<User> users) {
mUsers = users;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (mUsers != null)
return mUsers.size();
else return 0;
}
class UserViewHolder extends RecyclerView.ViewHolder {
private final TextView userItemView;
private UserViewHolder(View itemView) {
super(itemView);
userItemView = itemView.findViewById(R.id.textView);
}
}
}
创建相应的布局文件:
activity_main.xml
:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add User" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
recyclerview_item.xml
:<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textSize="20sp" />
通过以上步骤,你可以在 Android 应用中使用 Room、ViewModel 和 LiveData 来实现一个简单的用户管理系统。这个示例展示了如何在 Room 数据库中存储和检索数据,并使用 ViewModel 和 LiveData 在 UI 中显示这些数据。
领取专属 10元无门槛券
手把手带您无忧上云