Yousef
Yousef

Reputation: 94

Converting SQLite query to Firebase database query

I developed this app for my senior project and used SQLite and stored everything locally. I want to convert everything to Firebase now but there aren't that many tutorials out there, at least for what I'm trying to do. My question is how would I go about converting a query like the below to a Firebase database query?

public ArrayList<String> getAllBeautyItems() {

    itemsList.clear();

    dbHelper.getReadableDatabase();

    ArrayList<String> itemNames = new ArrayList<>();

    String[] tableColumns = new String[]{
            Constants.ITEM_NAME, Constants.CATEGORY
    };
    String whereClause = Constants.CATEGORY + "=?";
    String[] whereArgs = new String[]{
            "beauty"
    };

    Cursor result = db.query(Constants.ITEMS_TABLE_NAME, tableColumns, whereClause, whereArgs,
            null, null, null, null);


    if (result.moveToFirst()) {
        do {


       itemNames.add(result.getString(result.getColumnIndex(Constants.ITEM_NAME)));


        } while (result.moveToNext());

    }

    result.close();


    return itemNames;

}

and then in a fragment I'm calling a setName, so how do I get the result of that query and apply it like in the below?

 private ArrayList<Items> refreshData() {
    dbItems.clear();

    final ArrayList<String> itemNames = adapter.getAllBeautyItems();
    ArrayList<String> itemImages = adapter.getAllBeautyImages();
    ArrayList<Integer> itemPrices = adapter.getAllBeautyPrices();
    ArrayList<String> itemDescriptions = adapter.getAllBeautyDescriptions();
    ArrayList<String> itemLocations = adapter.getAllBeautyLocations();
    ArrayList<String> itemLats = adapter.getAllBeautyLats();



    int totalItems = adapter.getTotalBeautyItems();
    String formattedItems = Utils.formatNumber(totalItems);

    totalItemsText.setText("Total Items: " + formattedItems);


    ArrayList<Items> items = new ArrayList<>();


    for (int i = 0; i < itemNames.size(); i++) {

        Items item = new Items();

        item.setItemName(itemNames.get(i));
        item.setItemImage(itemImages.get(i));
        item.setItemPrice(itemPrices.get(i));
        item.setItemDescription(itemDescriptions.get(i));
        item.setItemLocation(itemLocations.get(i));
        item.setLatLocation(itemLats.get(i));

        items.add(item);

    }

    return items;

}

Upvotes: 1

Views: 4869

Answers (1)

JMedinilla
JMedinilla

Reputation: 481

First of all, I wanna recommend you this: https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html

It's a tutorial that show you how yo make typical SQL queries in Firebase, BUT, like the owner says:

While this post still contains some useful and relevant information, we have released advanced query functionality which solves a lot of the problems this post discusses.

So, now, I will tell you the basic query that may solve your problem.

As I see, you have a table about Items, and you are doing a SELECT where that item's Category is beauty.

I will assume that you already know how data is stored in Firebase, so I'm not making us lose time explaining to you about the database tree.


Reading

You will need something like:

Query query = FirebaseDatabase.getInstance().getReference()
                .child("items")
                .orderByChild("Category")
                .equalTo("beauty");

This, after attaching the listener to it, will search in the items tree, those items where the value of its category child, is beauty. The logic here is:

  1. FirebaseDatabase.getInstance().getReference() -> Go to the main node
  2. .child("items") -> Go to the Items node
  3. .orderByChild("Category") -> Order them by its Category child
  4. .equalTo("beauty") -> Look only at those with the "beauty" value

You will always need to do an orderBy*() to append an equalTo() and mimic the WHERE clause.

And, in your listener you will have something like:

ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                List<Item> list = new ArrayList<>();

                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                    Item item = snapshot.getValue(Item.class);
                    list.add(item);

                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            //
        }
    };
query.addValueEventListener(eventListener);

And, since all Firebase connections are async, you will need a calback method to return the list after the for.


Writing

Now, for the upload, you will need a DatabaseReference, instead of a Query, like:

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

And all you need to do is:

  • ref.push().setValue(item); -> For a random ID
  • ref.child(key).setValue(item); -> For an specific ID (key)

Upvotes: 1

Related Questions