簡體   English   中英

RXJAVA 房間 android

[英]RXJAVA ROOM android

嘗試學習 Room 和 RXJAVA。 我已經了解了大約 80%,但我一直在想辦法解決其余的問題。

這是我在插入數據上遇到的錯誤。

java.lang.NullPointerException:嘗試在空對象引用上調用接口方法“void 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:嘗試調用接口方法 'io.reactivex.Maybe com.example.learnroom。 EntityDao.getEntity(java.lang.String)' 在一個空對象引用上

我該如何解決?

我試圖將網絡上大多數使用 recyclerviews 的教程簡化為僅 2 個文本字段。 他們說這是 3 個部分,但看起來不像,因為數據庫從未設置過,所以我用一種方法運行它來運行代碼。 也許有人可以幫我解釋一下這是如何真正起作用的。 我的代碼

public interface EntityDao {

 @Query("SELECT * FROM Entitys WHERE ID  = :ID LIMIT 1")
Maybe<List<Entitys>> getEntity(String ID);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(Entitys entitys);

@Query("DELETE FROM Entitys")
void deleteAllEntity();
}

實體

 public class Entitys {

@PrimaryKey
@NonNull
public String ID;

public  String ts;
public  String tss;

public Entitys(@NonNull String ID, String ts, String tss) {
    this.ID = ID;
    this.ts = ts;
    this.tss = tss;
}

public String getTss() {
    return tss;
}

public void setTss(String tss) {
    this.tss = tss;
}

public void setID(String ID) {
    this.ID = ID;
}

public void setTs(String ts) {
    this.ts = ts;
}

public String getID() {
    return ID;
}

public String getTs() {
    return ts;
}
 } 

數據庫

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

崩潰的原因是你的PathwaysDB類中的這一行

public static EntityDao entityDao() {
return null;
}

它返回空值。 它應該像

public abstract EntityDao entityDao()

您忘記將 @Dao 注釋添加到您的 EntityDao 接口類中。 您還需要更改以下方法:

public static EntityDao entityDao() {
    return null;
}

public abstract EntityDao entityDao();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM