Android 我在哪里可以使用文件室保存数据?
我正在专门研究Android架构组件,但我是一名初学者,所以我正在尝试创建一个简单的应用程序,用于存储用户并在屏幕上显示用户名(用户可以只是代码测试,不需要创建UI) 当我在DB上插入用户时,我得到了错误,因为我不能在主线程上调用它,所以我可以在哪里调用它?我看到一些人使用AsyncTask,但我认为这不是正确的方法,或者使用RXjava之类的另一个库,我看到一些人使用实时数据,我不知道如何/在何处使用实时数据在DB上插入数据。 这就是我所拥有的: 主要活动:Android 我在哪里可以使用文件室保存数据?,android,database,lifecycle,android-room,android-architecture,Android,Database,Lifecycle,Android Room,Android Architecture,我正在专门研究Android架构组件,但我是一名初学者,所以我正在尝试创建一个简单的应用程序,用于存储用户并在屏幕上显示用户名(用户可以只是代码测试,不需要创建UI) 当我在DB上插入用户时,我得到了错误,因为我不能在主线程上调用它,所以我可以在哪里调用它?我看到一些人使用AsyncTask,但我认为这不是正确的方法,或者使用RXjava之类的另一个库,我看到一些人使用实时数据,我不知道如何/在何处使用实时数据在DB上插入数据。 这就是我所拥有的: 主要活动: protected void on
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);
}
用户:
用户道:
public interface UserDao {
@Query("SELECT * FROM user")
LiveData<List<User>> getUsers();
@Insert
void insert(User user);
}
公共接口UserDao{
@查询(“从用户中选择*)
LiveData getUsers();
@插入
无效插入(用户);
}
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);
}
}
public类UsersViewModel扩展了AndroidViewModel{
私有LiveData用户;
私有数据库;
public UsersViewModel(@NonNull应用程序){
超级(应用);
mDb=AppDatabase.getInMemoryDatabase(this.getApplication().getApplicationContext());
users=mDb.userModel().getUsers();
}
LiveDatagetUsers(){
返回用户;
}
void saveUser(用户){
mDb.userModel().insert(用户);
}
}
我看到一些人使用asyncTask,但我认为这不是正确的方法,也不是使用RXjava之类的库
这是正确的
我在哪里可以叫它
在单独的线程上。最简单的非Android示例是
// works (pre-java8)
Thread t = new Thread() {
@Override
public void run() {
mAppDatabase.userDao().insert(u);
}
};
t.start();
该代码是执行RX工作的良好起点
Kotlin还提供了更简单的线程语法
我看到一些人使用asyncTask,但我认为这不是正确的方法,也不是使用RXjava之类的库
这是正确的
我在哪里可以叫它
在单独的线程上。最简单的非Android示例是
// works (pre-java8)
Thread t = new Thread() {
@Override
public void run() {
mAppDatabase.userDao().insert(u);
}
};
t.start();
该代码是执行RX工作的良好起点
Kotlin还提供了更简单的线程语法。在后台线程上调用代码有几种方法: Java方式:
new Thread(()-> callDb()).start();
标准的“旧”android是异步任务:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(final Void... voids)
{
callDb();
return null;
}
}.execute();
.有几种在后台线程上调用代码的方法: Java方式:
new Thread(()-> callDb()).start();
标准的“旧”android是异步任务:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(final Void... voids)
{
callDb();
return null;
}
}.execute();
在main中调用SaveData()
private void SaveData(字符串名称)
{
用户testUser=新用户();
testUser.setName(名称);
新建异步任务(){
@凌驾
受保护的长[]doInBackground(对象…长)
{
final Long[]l=mAppDatabase.UserDAO().saveUser(testUser);
返回l;
}
@凌驾
PostExecute上受保护的void(长[]l)
{
如果(l.length==1)
{
//好的,保存
}
其他的
{
//不,不保存
}
}
}.execute();
}
在main中调用SaveData()
private void SaveData(字符串名称)
{
用户testUser=新用户();
testUser.setName(名称);
新建异步任务(){
@凌驾
受保护的长[]doInBackground(对象…长)
{
final Long[]l=mAppDatabase.UserDAO().saveUser(testUser);
返回l;
}
@凌驾
PostExecute上受保护的void(长[]l)
{
如果(l.length==1)
{
//好的,保存
}
其他的
{
//不,不保存
}
}
}.execute();
}
在这个方法中,您使用的是AsyncTask,我看到的其他示例不需要像我在question@Tigo2018问题是是否不使用AsyncTask在这个方法中,您使用的是AsyncTask,我看到了其他不需要使用的示例,就像我在question@Tigo2018问题是是否不使用AsyncTask如我在问题中所说,这是使用AsyncTask,我看到其他示例未使用它,可能他们正在使用RXjava如我在问题中所说,这是使用AsyncTask,我看到其他示例未使用它,可能他们正在使用RXjava,所以最好的,甚至是“正常的方法”是使用RXjava(如果我错了,请纠正我)这不是一种土生土长的方式吗?我看到了其他不使用RXjava o显式线程的示例,但我是一个非常新手,因此可能我错了,或者在您发布的链接中没有看到他们在@Icaro中的Room databaseBuilder上调用的.allowMainThreadQueries().build()
,但RXjava不一定是“最好的”,但它可以生成多线程代码(或者只是基于事件的操作)更容易相处。几乎所有的Android都是一个事件。。。你点击一个按钮,你输入的每个字符,任何外部通知,都是动作,你可以在RxJava术语中以可观察的或可流动的的形式“订阅”
,这样做的最佳甚至“正常方式”是使用RxJava(如果我错了,请纠正我)而不是本机方式?我看到了其他不使用RXjava o显式线程的示例,但我是一个非常新手,因此可能我错了,或者在您发布的链接中没有看到他们在@Icaro中的Room databaseBuilder上调用的.allowMainThreadQueries().build()
,但RXjava不一定是“最好的”,但它可以生成多线程代码(或者只是基于事件的操作)更容易相处。几乎所有的Android都是一个事件。。。单击按钮、键入的每个字符、任何外部通知,这些都是操作,您可以“订阅”RxJava术语中的可观察的或可流动的