我专门研究Android架构组件ROOM,但我是初学者,所以我尝试创建一个简单的应用程序来存储用户并在屏幕上显示用户名(用户可以只是代码中的测试,不需要创建UI)。
当我在DB上插入用户时,我收到错误因为我无法在主线程上调用它,所以在哪里我可以调用它?我看到有些人使用AsyncTask,但我不认为这是正确的方法或使用像RXjava这样的其他库,我看到一些人使用实时数据,我不知道如何/在何处使用实时数据来插入数据在DB上。 这就是我所拥有的:
MainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usersViewModel = ViewModelProviders.of(this).get(UsersViewModel.class);
usersViewModel.getUsers();
User testUser = new User("Test");
usersViewModel.saveUser(testUser);
}
用户:
@Entity
public class User {
public @PrimaryKey(autoGenerate = true) int id;
public String name;
public User(String name) {
this.name = name;
}
//Gets and Sets
}
UserDAO的:
public interface UserDao {
@Query("SELECT * FROM user")
LiveData<List<User>> getUsers();
@Insert
void insert(User user);
}
UserViewModel:
public class UsersViewModel extends AndroidViewModel {
private LiveData<List<User>> users;
private AppDatabase mDb;
public UsersViewModel(@NonNull Application application) {
super(application);
mDb = AppDatabase.getInMemoryDatabase(this.getApplication().getApplicationContext());
users = mDb.userModel().getUsers();
}
LiveData<List<User>>getUsers(){
return users;
}
void saveUser(User user) {
mDb.userModel().insert(user);
}
}
答案 0 :(得分:1)
我看到有些人使用asyncTask,但我不认为这是正确的方式或使用像RXjava这样的其他库
这是正确的
我可以打电话给它吗?
在一个单独的线程上。最简单的非Android示例是
// works (pre-java8)
Thread t = new Thread() {
@Override
public void run() {
mAppDatabase.userDao().insert(u);
}
};
t.start();
Android example architecture代码是进行RX工作的良好起点。
Kotlin还提供更简单的线程语法
答案 1 :(得分:1)
。有几种方法可以在后台线程上调用代码:
Java方式:
new Thread(()-> callDb()).start();
标准的“旧”android是AsyncTask:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(final Void... voids)
{
callDb();
return null;
}
}.execute();
大多数现代应用程序都会使用RxJava:
Observable.fromCallable(()-> doDbStuff()).subscribeOn(Schedulers.io()).subscribe();
答案 2 :(得分:0)
在main
中调用SaveData()private void SaveData(String name)
{
User testUser = new User();
testUser.setName(name);
new AsyncTask<Object, Object, Long[]>() {
@Override
protected Long[] doInBackground(Object... Long)
{
final Long[] l = mAppDatabase.UserDAO().saveUser(testUser);
return l;
}
@Override
protected void onPostExecute(Long[] l)
{
if(l.length == 1)
{
//ok saved
}
else
{
//no not saved
}
}
}.execute();
}