Android 我在哪里可以使用文件室保存数据?

Android 我在哪里可以使用文件室保存数据?,android,database,lifecycle,android-room,android-architecture,Android,Database,Lifecycle,Android Room,Android Architecture,我正在专门研究Android架构组件,但我是一名初学者,所以我正在尝试创建一个简单的应用程序,用于存储用户并在屏幕上显示用户名(用户可以只是代码测试,不需要创建UI) 当我在DB上插入用户时,我得到了错误,因为我不能在主线程上调用它,所以我可以在哪里调用它?我看到一些人使用AsyncTask,但我认为这不是正确的方法,或者使用RXjava之类的另一个库,我看到一些人使用实时数据,我不知道如何/在何处使用实时数据在DB上插入数据。 这就是我所拥有的: 主要活动: protected void on

我正在专门研究Android架构组件,但我是一名初学者,所以我正在尝试创建一个简单的应用程序,用于存储用户并在屏幕上显示用户名(用户可以只是代码测试,不需要创建UI)

当我在DB上插入用户时,我得到了错误,因为我不能在主线程上调用它,所以我可以在哪里调用它?我看到一些人使用AsyncTask,但我认为这不是正确的方法,或者使用RXjava之类的另一个库,我看到一些人使用实时数据,我不知道如何/在何处使用实时数据在DB上插入数据。 这就是我所拥有的:

主要活动:

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术语中的
可观察的
可流动的