0

我正在研究Android架构组件,特别是ROOM,但我是初学者,所以我正在尝试创建一个简单的应用程序来存储用户并在屏幕上显示用户名(用户可以只是代码中的测试不需要要创建的 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);
}

用户:

@Entity
public class User {
    public @PrimaryKey(autoGenerate = true) int id;
    public String name;
    public User(String name) {
        this.name = name;
    }
//Gets and Sets
}

用户道:

public interface UserDao {
    @Query("SELECT * FROM user")
    LiveData<List<User>> getUsers();
    @Insert
    void insert(User user);
}

用户视图模型:

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);
    }
}
4

3 回答 3

1

我看到有些人使用 asyncTask 但我不认为这是正确的方式或使用另一个库,如 RXjava

它是正确的

我在哪里可以调用它?

在一个单独的线程上。最简单的非 Android 示例是

// works (pre-java8)
Thread t = new Thread() {
    @Override
    public void run() {
        mAppDatabase.userDao().insert(u);
    }
};
t.start();

Android 示例架构代码是进行 RX 工作的良好起点。

Kotlin 还提供了更简单的线程语法

于 2018-02-09T18:39:52.123 回答
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();
于 2018-02-09T18:50:20.960 回答
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();
    }
于 2018-02-09T18:59:25.747 回答