Проблемы получения данных из базы данных в реальном времени Firebase - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я делаю приложение для меню ресторана и следил за некоторыми онлайн-уроками, где парень смог отобразить то, что было в его базе данных в реальном времени в его приложении. В настоящее время я могу добавлять новые пункты меню в свою базу данных через свое приложение (отраженное в самой базе данных), но внутри самого приложения я не могу на самом деле извлечь базу данных. Есть ли ошибки в моем коде? Любая помощь будет принята с благодарностью!

'' '

EditText editTextItemName, editTextPrice;
Spinner spinnerSection;
ListView ListViewItems;
Button buttonMainMenu, buttonAddItem;
List<Items> listItems;

DatabaseReference databaseItems;


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

    databaseItems = FirebaseDatabase.getInstance().getReference("items");
    listItems = new ArrayList<>();
    //ItemActivity ItemAdapter = new ItemActivity(Main2Activity.this,listItems);//
    //ListViewItems.setAdapter(ItemAdapter);//

    buttonMainMenu = (Button) findViewById(R.id.buttonMainMenu);
    buttonMainMenu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openMainActivity();
        }
    });
    buttonAddItem = (Button) findViewById(R.id.buttonAddItem);
    editTextItemName = (EditText) findViewById(R.id.editTextItemName);
    editTextPrice = (EditText) findViewById(R.id.editTextPrice);
    spinnerSection = (Spinner) findViewById(R.id.spinnerSection);
    ListViewItems = (ListView) findViewById(R.id.ListViewItems);
    buttonAddItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            addItems();
        }
    });

    ListViewItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            Items Items = listItems.get(i);
            showUpdateDeleteDialog(Items.getItemsId(), Items.getItemName());
            return true;

        }
    });
}
    @Override
    protected void onStart() {
        super.onStart();


        databaseItems.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listItems.clear();
                for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()) {
                    Items items = itemSnapshot.getValue(Items.class);
                    listItems.add(items);
                }
                ItemActivity adapter = new ItemActivity(Main2Activity.this, listItems);
                ListViewItems.setAdapter(adapter);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                throw databaseError.toException();

            }
        });
}

private void addItems(){
    String Name = editTextItemName.getText().toString().trim();
    String Price = editTextPrice.getText().toString().trim();
    String Section = spinnerSection.getSelectedItem().toString();

    if (ItemName.isEmpty()) {
        editTextItemName.setError("Item Name can't be empty");
        editTextItemName.requestFocus();
        return;
    }

    if (Price.isEmpty()) {
        editTextPrice.setError("Price can't be empty");
        editTextPrice.requestFocus();
        return;
    } else {
        String id = databaseItems.push().getKey();
        Items items = new Items(id, ItemName, Section, Price);
        databaseItems.child(id).setValue(items);
        Toast.makeText(this, "Item Added", Toast.LENGTH_LONG).show();
    }
}
public void openMainActivity(){
    Intent intent = new Intent(this,MainActivity.class);
    startActivity(intent);
}

private void showUpdateDeleteDialog(final String ItemsId, String ItemName) {

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.dialog_update_items, null);
    dialogBuilder.setView(dialogView);

    final EditText editTextItemName = (EditText) dialogView.findViewById(R.id.editTextItemName);
    final EditText editTextPrice = (EditText) dialogView.findViewById(R.id.editTextPrice);
    final Spinner spinnerSection = (Spinner) dialogView.findViewById(R.id.spinnerSection);
    final Button buttonUpdateItem = (Button) dialogView.findViewById(R.id.buttonUpdateItem);
    final Button buttonDeleteItem = (Button) dialogView.findViewById(R.id.buttonDeleteItem);

    dialogBuilder.setTitle(ItemName);
    final AlertDialog b = dialogBuilder.create();
    b.show();

    buttonUpdateItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String ItemName = editTextItemName.getText().toString().trim();
            String ItemPrice = editTextPrice.getText().toString().trim();
            String ItemSection = spinnerSection.getSelectedItem().toString();

            if (ItemName.isEmpty()) {
                editTextItemName.setError("Item Name can't be empty");
                editTextItemName.requestFocus();
                return;
            }

            if (ItemPrice.isEmpty()) {
                editTextPrice.setError("Price can't be empty");
                editTextPrice.requestFocus();
                return;
            }
            else updateItems(ItemsId, ItemName, ItemSection, ItemPrice);
        }
    });

    buttonDeleteItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            deleteItems(ItemsId);
        }
    });
}



private boolean updateItems(String id, String Name, String Section, String Price){

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("items").child(id);

    Items items = new Items(id, Name, Section, Price);

    databaseReference.setValue(items);

    Toast.makeText(this, "Item Updated", Toast.LENGTH_LONG).show();

    return true;
}

private void deleteItems(String ItemsId) {

    DatabaseReference drItems = FirebaseDatabase.getInstance().getReference("items").child(ItemsId);

    drItems.removeValue();

    Toast.makeText(this, "Item Deleted", Toast.LENGTH_LONG).show();
}

}' ''

JSON Tree

Запустить вкладку при открытии этого действия

1 Ответ

0 голосов
/ 24 апреля 2020

Это будет долгий путь, садитесь. ?.

Прежде всего я хотел бы заменить идентификаторы базы данных натуральными числами. Для этого вам нужно изменить способ добавления новых элементов:

Создать класс AddNewItems:

package com.<package-name>; 

public class AddNewItems {

    private String name;
    private String section;
    private String price;
    private int id;

    public AddNewItems() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSection() {
        return section;
    }

    public void setSection(String section) {
        this.section = section;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price; 
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}   

Теперь давайте вернемся к вашей основной деятельности, откуда вы добавляете новые элементы. Измените addItem() на следующее:

AddNewItems addNewItems; //Add this below your DatabaseReference databaseItems;

private void addItems(){
    String Name = editTextItemName.getText().toString().trim();
    String Price = editTextPrice.getText().toString().trim();
    String Section = spinnerSection.getSelectedItem().toString();

    String lastItemIdFetched; //This will check ID of last item and assign new value to new items.
    Int lastIdInt; //For adding 1, we need to convert to int
    //Make sure you read the note at bottom

    if (ItemName.isEmpty()) {
        editTextItemName.setError("Item Name can't be empty");
        editTextItemName.requestFocus();
        return;
    }

    if (Price.isEmpty()) {
        editTextPrice.setError("Price can't be empty");
        editTextPrice.requestFocus();
        return;
    } else {
        //For sake of automating new ID
        DatabaseReference addItemIdRef;
        addItemIdRef = FirebaseDatabase.getInstance().getReference("itemIDs");

        addItemIdRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                try {
                    lastItemIDFetched = dataSnapshot.child("lastItemID").getValue().toString();
                    lastIdInt = Integer.parseInt(lastItemIdFetched);
                    lastIdInt = lastIdInt + 1;
                }catch (Throwable e){
                    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
                }

            }

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

            }
        });

        // Adding data in database
        addNewItems.setName(Name);
        addNewItems.setSection(Section);
        addNewItems.setPrice(Price);
        addNewItems.setId(lastIdInt);

        databaseItems.child(lastIdInt).setValue(addNewItems);
        Toast.makeText(getApplicationContext(), "New Item has been added to your menu.", Toast.LENGTH_SHORT).show();

        // We also need to value of last ID in database. So do this.
        Map<String, Object> updateNewID = new HashMap<>();
        updateNewID.put("lastItemID", lastIdInt);

        addItemIdRef.child("lastItemID).updateChildren(updateNewID).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Toast.makeText(getApplicationContext(), "Success on updating", Toast.LENGTH_LONG).show();
            }
        }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
            }
         });

        //WE have successfully updated the last item ID
    }
}

ПРИМЕЧАНИЕ: По мере извлечения lastItemID из базы данных. Нет кода для проверки, если это первый элемент или нет, и может привести к Cra sh. Если вы не хотели увеличивать код (который уже есть), пожалуйста, создайте следующее вручную из консоли.

enter image description here

Создайте новый узел, как показано, и установите значение 0, поэтому при добавлении первого элемента его идентификатор будет 1.

Теперь, возвращаясь к части извлечения, сделайте это в вашей функции onStart(): давайте сделаем это, используя список:

//Create a listView in XML also and define it in MainActivity.
//ListView listItems = (ListView) findViewById(R.id.resource_name); 
//First create a list and adapter 
ArrayList<String> listItems=new ArrayList<String>();
ArrayAdapter<String> adapter;

DatabaseReference fetchItemsRef;
fetchItemsRef = FirebaseDatabase.getInstance().getReference("items");

DatabaseReference getTotalNumberOfItemsRef;
getTotalNumberOfItemsRef = FirebaseDatabase.getInstance().getReference("itemIDs");

Int i, totalNumberOfItems;
//I've again added this to check number items available. 

//Put this in your `onStart()` function.
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
setListAdapter(adapter);

//Get total number of items:           
getTotalNumberOfItemsRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        try {
            totalNumberOfItems = Integer.parseInt(dataSnapshot.child("lastItemID").getValue().toString());            
            }catch (Throwable e){
                 Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

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

    }
});

//Now let's fetch the data from Firebase using a `for loop`: 
for(int i=0; i<=totalNumberOfItems; i++){
    String currentItemName = "item"+i;

    fetchItemsRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                currentItemName = dataSnapshot.child(i).getValue().toString();            
            }catch (Throwable e){
                    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

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

        }
    });

    listItems.add(currentItemName);
    adapter.notifyDataSetChanged();
}

Теперь вы должны убедиться, что все элементы в вашей базе данных являются непрерывными целыми числами. как 1,2,3 ... и не должно быть 1,2,4,5,8 ... потому что нет кода, который может обрабатывать нулевые объекты. Вы можете добавить это, используя условные операторы позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...