通过pojo获取firebase自动生成ID,我的模型类的getter()方法返回null

时间:2019-11-12 12:55:27

标签: java android firebase firebase-realtime-database

我正在使用一个应用程序,但是当我尝试访问firebase数据时,POJO的getter方法返回null。我无法访问RecyclerView

中的数据和设置

这是我所做的:

我的Firebase结构:

enter image description here

我的应用调试模式:

enter image description here

我的图书课

public class Book {
private String bookId;
private String bookImage;
private String bookName;
private String writerName;
private String publisherName;
private String shortDesc;


public Book() {
}

public Book(String bookImage, String bookName,
            String writerName, String publisherName,String shortDesc) {
    this.bookImage = bookImage;
    this.bookName = bookName;
    this.writerName = writerName;
    this.publisherName = publisherName;
    this.shortDesc = shortDesc;
}

public Book(String bookId, String bookImage, String bookName,
            String writerName, String publisherName, String shortDesc) {
    this.bookId = bookId;
    this.bookImage = bookImage;
    this.bookName = bookName;
    this.writerName = writerName;
    this.publisherName = publisherName;
    this.shortDesc = shortDesc;
}

public String getBookId() {
    return bookId;
}

public String getBookImage() {
    return bookImage;
}

public String getBookName() {
    return bookName;
}

public String getWriterName() {
    return writerName;
}

public String getPublisherName() {
    return publisherName;
}

public String getShortDesc() {
    return shortDesc;
}

public void setBookId(String bookId) {
    this.bookId = bookId;
}

我的BookListFragment显示我的图书清单

public class BookListFragment extends Fragment {

private Button button1,button2,button3;
private RecyclerView bookListRv;
private ArrayList<Book> bookList;
private BookAdapter bookAdapter;
private String adminId;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;



public BookListFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_book_list, container, false);

    init(view);

    adminId = firebaseAuth.getUid();
     Book book = new Book();
    String bookid =book.getBookId();

    configRV();

    getBooks();



    return view;
}



private void init(View view) {
    bookListRv = view.findViewById(R.id.bookRVId);
    firebaseAuth = firebaseAuth.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    bookList = new ArrayList<>();
    bookAdapter = new BookAdapter(bookList, getContext());



}

private void configRV() {

    bookListRv.setLayoutManager(new LinearLayoutManager(getContext()));
    bookListRv.setAdapter(bookAdapter);
}

private void getBooks() {

    DatabaseReference showBookRef = databaseReference.child("Books").child(adminId);

    showBookRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot data:dataSnapshot.getChildren()){
                    Book book = data.getValue(Book.class);
                    bookList.add(book);
                    bookAdapter.notifyDataSetChanged();
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

}

我的AddBookActivity

公共类AddBookActivity扩展了AppCompatActivity {

private Button addBookBtn;
private ImageView bookIv;
private EditText bookNameEt,writerNameEt,publisherNameEt,shortDescEt;
private Uri imgUrl = null;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
private StorageReference imgReference;
private String adminId,imgUri="";
private FirebaseUser mFirebaseUser;

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

    init();

    if(mFirebaseUser!=null){
        adminId = mFirebaseUser.getUid();
    }


    bookIv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent,1);
        }
    });

    addBookBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            addBookData();

        }
    });

}




private void init() {
    firebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = firebaseAuth.getCurrentUser();
    imgReference = FirebaseStorage.getInstance().getReference();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    addBookBtn = findViewById(R.id.addBookBtnId);
    bookIv = findViewById(R.id.addBookIvId);
    bookNameEt = findViewById(R.id.addBookNameEtId);
    writerNameEt = findViewById(R.id.addBookWriterNameEtId);
    publisherNameEt = findViewById(R.id.addBookPublisherNameEtId);
    shortDescEt = findViewById(R.id.addBookDescripEtId);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode==1 && resultCode==RESULT_OK){
        if(data!=null){
             imgUrl = data.getData();
            bookIv.setImageURI(imgUrl);


        }
    }
}



private void addBookData() {

    if (imgUrl!=null) {
        final StorageReference filePath = imgReference.child("Book_images").child(String.valueOf(System.currentTimeMillis()));
        filePath.putFile(imgUrl).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                if (task.isSuccessful()) {
                    filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            imgUri=uri.toString();
                        }
                    });
                }
            }
        });
    }

    String bookName = bookNameEt.getText().toString();
    String writerName = writerNameEt.getText().toString();
    String publisherName = publisherNameEt.getText().toString();
    String bookDesc = shortDescEt.getText().toString();
    String bookImg = imgUri;

    if(TextUtils.isEmpty(bookName) && TextUtils.isEmpty(writerName)
            && TextUtils.isEmpty(publisherName) && TextUtils.isEmpty(bookDesc) && TextUtils.isEmpty(bookImg)){
        Toast.makeText(this,"Please Fill The Blank Field",Toast.LENGTH_LONG).show();
    }
    else if(!TextUtils.isEmpty(bookName) && !TextUtils.isEmpty(writerName)
            && !TextUtils.isEmpty(publisherName) && !TextUtils.isEmpty(bookDesc) && !TextUtils.isEmpty(bookImg)){

        saveBook(bookImg,bookName,writerName,publisherName,bookDesc);
    }
}

private void saveBook(String url, String bookName, String writerName, String publisherName, String bookDesc) {

    DatabaseReference bookRef = databaseReference.child("Books").child(adminId);
    String bookId = bookRef.push().getKey();
    if(bookId!=null){
        Book book = new Book(bookId,url,bookName,writerName,publisherName,bookDesc);
        bookRef.child(bookId).child("BookInfo").setValue(book).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

            }
        });
    }



}

}

我的BookAdapter

公共类BookAdapter扩展了RecyclerView.Adapter {

private List<Book> books;
private Context context;

public BookAdapter(List<Book> books, Context context) {
    this.books = books;
    this.context = context;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_book_layout,parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    final Book currentBook = books.get(position);
   // holder.bookIv.setIm(currentBook.getBookImage());
    holder.bookNameTv.setText(currentBook.getBookName());
    holder.writerNameTv.setText(currentBook.getWriterName());
    holder.publisherNameTv.setText(currentBook.getPublisherName());
    holder.shortDescTv.setText(currentBook.getShortDesc());
}

@Override
public int getItemCount() {
    return books.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView bookNameTv,writerNameTv,publisherNameTv,shortDescTv;
    private ImageView bookIv;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);

         bookIv = itemView.findViewById(R.id.bookListIvId);
         bookNameTv = itemView.findViewById(R.id.bookListNameTvId);
         writerNameTv = itemView.findViewById(R.id.bookListWriterNameTvId);
         publisherNameTv = itemView.findViewById(R.id.bookListPubNameTvId);
         shortDescTv = itemView.findViewById(R.id.bookListShortDescTvId);
    }
}

}

现在,当我调试我的应用程序时,向我显示Book类参考书的调试器全部为空。

任何帮助我得到赞赏的人

3 个答案:

答案 0 :(得分:1)

这是因为您正在应用程序中创建book对象,并且未从firebase中获取book。您需要使用adminId查询图书

答案 1 :(得分:1)

您必须直接将BookInfo放置在外部,即YourRootId-> SubId-> YourInfo,但这就是您用作YourRootId-> SubId-> BookInfo-> YourInfo的方式(如果只想检索特定数据,这是正确的)

因此,首先设置FirebaseRecyclerAdapter

Query query = FirebaseDatabase.getInstance()
    .getReference()
    .child("yourRootId/");

FirebaseRecyclerOptions<Book> options = FirebaseRecyclerOptions.Builder<Book>()
                    .setQuery(query, Book.class)
                    .build();

FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Book, BookHolder>(options) {
@Override
public BookHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // Create a new instance of the ViewHolder, in this case we are using a custom
    // layout called R.layout.message for each item
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.yourlayout, parent, false);

    return new BookHolder(view);
}

    @Override
    protected void onBindViewHolder(BookHolder holder, int position, Book model) {
    // assign all data in here
    }
};

然后创建一个视图持有人

public class BookHolder extends RecyclerView.ViewHolder {
    public LinearLayout root;
    public TextView abc;
    public TextView xyz;

    public ViewHolder(View itemView) {
        super(itemView);
        abc= itemView.findViewById(R.id.list_title);
        xyz= itemView.findViewById(R.id.list_desc);
    }
}

答案 2 :(得分:0)

您必须再深入一层以获得 BookInfo 。尝试使用以下代码:

showBookRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for(DataSnapshot data: dataSnapshot.getChildren()) {
            Book book = data.child("BookInfo").getValue(Book.class);
            bookList.add(book);
        }

        bookAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});