将SQLite查询转换为Firebase数据库查询

时间:2017-04-25 20:47:52

标签: android sqlite firebase firebase-realtime-database android-sqlite

我为我的高级项目开发了这个应用程序并使用了SQLite并在本地存储了所有内容。我现在要将所有内容转换为Firebase,但是那里没有那么多教程,至少我想要做什么。我的问题是如何将下面的查询转换为Firebase数据库查询?

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;

}

然后在一个片段中我调用一个setName,那么如何获得该查询的结果并将其应用如下所示?

 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;

}

1 个答案:

答案 0 :(得分:1)

首先,我想推荐你:https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html

这是一个教程,向您展示如何在Firebase中进行典型的SQL查询, BUT ,就像所有者说的那样:

  

虽然这篇文章仍然包含一些有用和相关的信息,但我们发布了高级查询功能,解决了本文讨论的许多问题。

所以,现在,我将告诉您可以解决您问题的基本查询。

正如我所看到的,你有一个关于项目的表格,你正在进行SELECT项目的类别美容

我将假设您已经知道Firebase中的数据存储方式,因此我不会浪费时间向您解释有关数据库树的信息。

您将需要以下内容:

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

这样,在将监听器附加到它之后,将在项目树中搜索其类别子项的值为美的项目树。这里的逻辑是:

  1. FirebaseDatabase.getInstance().getReference() - &gt;转到主节点
  2. .child("items") - &gt;转到“项目”节点
  3. .orderByChild("Category") - &gt;按类别孩子订购
  4. .equalTo("beauty") - &gt;只看那些具有“美丽”价值的人
  5. 您始终需要orderBy*()附加equalTo()并模仿WHERE条款。

    而且,在你的听众中,你会有类似的东西:

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

    并且,由于所有Firebase连接都是 async ,因此您需要一个calback方法才能在for之后返回列表。

    编写

    现在,对于上传,您将需要DatabaseReference而不是Query,例如:

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

    您需要做的就是:

    • ref.push().setValue(item); - &gt;对于随机ID
    • ref.child(key).setValue(item); - &gt;对于特定ID(密钥)