android - 如何使用 AsyncTask 中的用户 ID 获取当前登录的用户
问题描述
我正在使用 MVVM android 架构。我想使用我存储在我的共享首选项类中的 user_id 来获取当前登录的用户。
我尝试直接从房间数据库中获取用户,但出现一个错误,指出我必须在后台线程中执行此操作。我正在尝试使用 AsyncTask,但它无法正常工作。
我的用户模型
@Entity(tableName = "users")
public class User {
@PrimaryKey(autoGenerate = true)
private long id;
private String name;
private String email;
private String imageUrl;
public User(String name, String email, String imageUrl) {
this.name = name;
this.email = email;
this.imageUrl = imageUrl;
}
public User() {
}
my getters and setters here
}
我的数据库
@Database(entities = {AnimalTreatment.class, Animals.class,
FarmTask.class, Finance.class, LandAndCrop.class, Machine.class,
User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
public static synchronized AppDatabase getInstance(Context context) {
if (instance == null) {
instance =
Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class,
"database")
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
public abstract UserDao userDao();
}
我的道
@Dao
public interface UserDao {
@Query("SELECT * FROM users WHERE id = :id")
User getUser(long id);
}
我的存储库类
public class UserRepository {
public UserDao userDao;
private User user;
private long userId;
public UserRepository(Application application) {
userId = Settings.getUserId();
AppDatabase database = AppDatabase.getInstance(application);
userDao = database.userDao();
}
public User getCurrentUser(){
new getCurrentUser(userId,userDao).execute();
return user;
}
####This where am confussed how do i return a user in the
getCurrentUser() above ###
public static class getCurrentUser extends AsyncTask<Void, Void,
User> {
private long userId;
private User user;
private UserDao userDao;
public getCurrentUser(long userId, UserDao userDao) {
this.userId = userId;
this.userDao = userDao;
}
@Override
protected User doInBackground(Void... voids) {
// user = new UserRepository(UserRepository.this);
user = userDao.getUser(userId);
return user;
}
}
}
我的视图模型类
public class UserViewModel extends AndroidViewModel {
private static final String TAG = "UserViewModel";
private UserRepository userRepository;
private User user;
private UserDao userDao;
public UserViewModel( Application application) {
super(application);
Log.d(TAG, "UserViewModel: Instantiation of UserViewModel");
userRepository = new UserRepository(application);
}
public User getCurrentUser() {
user = userRepository.getCurrentUser();
return user;
}
}
I want to get the currently signed in user from my database(room)
解决方案
您不需要在后台线程中执行查询,房间会自动处理它。
public static User getUser(long id, Context application){
return AppDatabase.getInstance(application).userDao().getUser(id);
}
您可以从应用程序中的任何位置调用它。示例:在onCreate
一个活动中
User user=ClassName.getUser(234628263, this);
初始化数据库时
Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class,
"database")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
这将允许您在 MainThread 上执行查询
.allowMainThreadQueries()
推荐阅读
- sql-server - 物化视图概念是否与 SQL Server 中的索引视图相同?
- reactjs - React 登录表单循环不会重新渲染 DOM
- php - 如何在 Laravel8 中制作下载功能(从其他网站链接)?
- python - 如何获取多部分/表单数据二进制文件的大小?
- swift - 与运行 Big sur11.4 的 iPhone 模拟器上的调试器失去连接
- javascript - 如何将@if 用于悬停元素?
- c# - 下拉级联
- r - 如何在 R 中连接 3 个具有不完整值的表
- javascript - Redux 能够将字符设置为数组,但是删除操作似乎没有到达 reducer
- asp.net - 将 id 值存储到隐藏字段中