RXJAVA ROOM android

RXJAVA ROOM android,android,android-room,rx-android,Android,Android Room,Rx Android,尝试学习Room和RXJAVA。 我已经理解了其中80%的内容,但我仍在努力解决其余的问题 这是我在插入数据上得到的错误 java.lang.NullPointerException:尝试调用接口方法 “空虚 com.example.learnroom.EntityDao.insert(com.example.learnroom.Entitys)' 关于空对象引用 如果我不运行try-catch,我会得到以下错误,这似乎是相关的 java.lang.RuntimeException:无法启动活动

尝试学习Room和RXJAVA。 我已经理解了其中80%的内容,但我仍在努力解决其余的问题

这是我在插入数据上得到的错误

java.lang.NullPointerException:尝试调用接口方法 “空虚 com.example.learnroom.EntityDao.insert(com.example.learnroom.Entitys)' 关于空对象引用

如果我不运行try-catch,我会得到以下错误,这似乎是相关的

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.learnroom/com.example.learnroom.MainActivity}: java.lang.NullPointerException:尝试调用接口方法 “也许吧 null上的com.example.learnroom.EntityDao.getEntity(java.lang.String)“” 对象引用

我该如何解决这个问题

我已经尝试过将web上的教程(大多数使用recyclerviews)简化为2个文本字段。他们说这是3个部分,但似乎不是这样,因为DB从未设置过,所以我用一种方法运行它来运行代码。也许有人能帮我解释一下这到底是怎么回事。 我的代码

数据库

 @Database(entities = {Entitys.class}, version = 1)
 public abstract class PathwaysDB extends RoomDatabase {

private static volatile PathwaysDB INSTANCE;

public static EntityDao entityDao() {
    return null;
}

public static PathwaysDB getInstance(Context context) {
    if (INSTANCE == null) {
        synchronized (PathwaysDB.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        PathwaysDB.class, "Pathwaysdb")
                        .build();
            }
        }
    }
    return INSTANCE;
}


 }
主要活动

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final String TAG = MainActivity.class.getSimpleName();
Button tb;
EditText te, tes;
String ts, tss, ID;

CompositeDisposable compositeDisposable = new CompositeDisposable();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ID ="test";
    te = findViewById(R.id.te);

    tb = findViewById(R.id.tb);
    tb.setOnClickListener(this);

    tes = findViewById(R.id.tes);

    Builddb();

    try{
    getData();}catch (Exception e){}
}

   private void Builddb() {

    Completable.fromAction(() -> PathwaysDB.getInstance(this))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    compositeDisposable.add(d);
                }

                @Override
                public void onComplete() {
                    // action was completed successfully
                }

                @Override
                public void onError(Throwable e) {
                    // something went wrong
                }
            });
}

private void getData() {

    Maybe<List<Entitys>> single = entityDao().getEntity(ID);
    single.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new MaybeObserver<List<Entitys>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    // add it to a CompositeDisposable
                }

                @Override
                public void onSuccess(List<Entitys> entity) {
                    te.setText(entity.indexOf(ts));
                    tes.setText(entity.indexOf(tss));
                }
                @Override
                public void onError(Throwable e) {
                    // show an error message
                }

                @Override
                public void onComplete() {
                }
            });

    compositeDisposable.add((Disposable) single);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    compositeDisposable.dispose();
}

private void updateUserName() {

   ts = te.getText().toString();
   tss = tes.getText().toString();
   Entitys entitys = new Entitys(ID, ts, tss);

    Completable.fromAction(() -> entityDao().insert(entitys))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    compositeDisposable.add(d);
                }

                @Override
                public void onComplete() {
                    // action was completed successfully
                }

                @Override
                public void onError(Throwable e) {
                    // something went wrong
                }
            });


}

@Override
public void onClick(View view) {
    updateUserName();

    Intent forward = new Intent(this, secondpage.class);
    startActivity(forward);
}
 }
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私有静态最终字符串标记=MainActivity.class.getSimpleName();
按钮tb;
编辑文本te,tes;
字符串ts,tss,ID;
CompositeDisposable CompositeDisposable=新的CompositeDisposable();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ID=“测试”;
te=findViewById(R.id.te);
tb=findViewById(R.id.tb);
tb.setOnClickListener(this);
tes=findViewById(R.id.tes);
Builddb();
试一试{
getData();}捕获(异常e){
}
私有void Builddb(){
Completable.fromAction(()->PathwaysDB.getInstance(this))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新的CompletableObserver(){
@凌驾
认购的公共无效(一次性d){
可合成。添加(d);
}
@凌驾
未完成的公共空间(){
//操作已成功完成
}
@凌驾
公共无效申报人(可丢弃的e){
//出了点问题
}
});
}
私有void getData(){
可能是single=entityDao().getEntity(ID);
single.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新的MaybeObserver(){
@凌驾
认购的公共无效(一次性d){
//将其添加到CompositeDisposable
}
@凌驾
成功时公共作废(列表实体){
te.setText(entity.indexOf(ts));
tes.SETEXT(实体索引(tss));
}
@凌驾
公共无效申报人(可丢弃的e){
//显示错误消息
}
@凌驾
未完成的公共空间(){
}
});
可组合。添加((一次性)单个);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
compositeDisposable.dispose();
}
私有void updateUserName(){
ts=te.getText().toString();
tss=tes.getText().toString();
Entitys Entitys=新的Entitys(ID、ts、tss);
Completable.fromAction(()->entityDao().insert(entitys))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新的CompletableObserver(){
@凌驾
认购的公共无效(一次性d){
可合成。添加(d);
}
@凌驾
未完成的公共空间(){
//操作已成功完成
}
@凌驾
公共无效申报人(可丢弃的e){
//出了点问题
}
});
}
@凌驾
公共void onClick(视图){
updateUserName();
意向转发=新意向(此,secondpage.class);
星触觉(向前);
}
}

崩溃的原因是您的路径SDB类中的这一行

public static EntityDao entityDao() {
return null;
}
它正在返回null。应该是

public abstract EntityDao entityDao()

您忘了将@Dao注释添加到EntityDao接口类中。 您还需要更改以下方法:

public static EntityDao entityDao() {
    return null;
}


NullPointerException
由于从
entityDao()返回
null
,请不要将问题编辑为答案。我已将此返回到修订版2,这是最后一个好的提问状态。非常欢迎您提供自我回答-您可以查看答案材料的文本。谢谢您的帮助。如果我按照建议更改代码,我将无法编译。以下错误:找不到符号方法entityDao(),方法entityDao()应该是什么?问题是这里可能是single=entityDao().getEntity(ID);fromAction(()->entityDao().insert(entitys))我曾尝试将数据库作为PathwaysDB.entityDao()放在前面,但它告诉我不能从静态上下文引用非静态方法。您必须使用类实例,即可以使用PathwaysDB.getInstance(context).entityDao()。而且你必须使用正确的上下文。在activity中,您可以使用activity context。我认为是getApplicationContext()丢失了,因为我不再收到该错误,应用程序继续运行。非常感谢。我一直在放这个。还有这个。我仍然有一个问题的数据回来填补领域虽然。我将在稍后发布一个增益,我将试着让它值得一试。我发现了上面更改代码的最后一部分。非常感谢。
public abstract EntityDao entityDao()
public static EntityDao entityDao() {
    return null;
}
public abstract EntityDao entityDao();