Adding Firebase data, dots and forward slashes

后端 未结 9 2053
长情又很酷
长情又很酷 2020-12-01 12:32

I try to use firebase db, I found very important restrictions, which are not described in firebase help or FAQ.

First problem is that symbol: dot \'.\' prohibited in

相关标签:
9条回答
  • 2020-12-01 13:01

    I wrote this for Java (since I came here expecting a java implementation):

    public static String encodeForFirebaseKey(String s) {
        return s
                .replace("_", "__")
                .replace(".", "_P")
                .replace("$", "_D")
                .replace("#", "_H")
                .replace("[", "_O")
                .replace("]", "_C")
                .replace("/", "_S")
                ;
    }
    
    public static String decodeFromFirebaseKey(String s) {
        int i = 0;
        int ni;
        String res = "";
        while ((ni = s.indexOf("_", i)) != -1) {
            res += s.substring(i, ni);
            if (ni + 1 < s.length()) {
                char nc = s.charAt(ni + 1);
                if (nc == '_') {
                    res += '_';
                } else if (nc == 'P') {
                    res += '.';
                } else if (nc == 'D') {
                    res += '$';
                } else if (nc == 'H') {
                    res += '#';
                } else if (nc == 'O') {
                    res += '[';
                } else if (nc == 'C') {
                    res += ']';
                } else if (nc == 'S') {
                    res += '/';
                } else {
                    // this case is due to bad encoding
                }
                i = ni + 2;
            } else {
                // this case is due to bad encoding
                break;
            }
        }
        res += s.substring(i);
        return res;
    }
    
    0 讨论(0)
  • 2020-12-01 13:03

    I faced the same problem myself, and I have created firebase-encode for this purpose.

    Unlike the chosen answer, firebase-encode encodes only unsafe characters (./[]#$) and % (necessary due to how encoding/decoding works). It leaves other special characters that are safe to be used as firebase key while encodeURIComponent will encode them.

    Here's the source code for details:

    // http://stackoverflow.com/a/6969486/692528
    const escapeRegExp = (str) => str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
    
    
    const chars = '.$[]#/%'.split('');
    const charCodes = chars.map((c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
    
    const charToCode = {};
    const codeToChar = {};
    chars.forEach((c, i) => {
      charToCode[c] = charCodes[i];
      codeToChar[charCodes[i]] = c;
    });
    
    const charsRegex = new RegExp(`[${escapeRegExp(chars.join(''))}]`, 'g');
    const charCodesRegex = new RegExp(charCodes.join('|'), 'g');
    
    const encode = (str) => str.replace(charsRegex, (match) => charToCode[match]);
    const decode = (str) => str.replace(charCodesRegex, (match) => codeToChar[match]);
    
    0 讨论(0)
  • 2020-12-01 13:12

    If you're using Swift 3, this works for me (try it in a playground):

    var str = "this.is/a#crazy[string]right$here.$[]#/"
    
    if let strEncoded = str.addingPercentEncoding(withAllowedCharacters: .alphanumerics) {
        print(strEncoded)
    
        if let strDecoded = strEncoded.removingPercentEncoding {
            print(strDecoded)
        }
    }
    
    0 讨论(0)
  • 2020-12-01 13:13

    Even though it is not what OP asks,
    but in my experience rather than using such dubious keys it is better to let .push() create an id,
    and other things - e-mail, date etc. save as content of the dedicated fields.

    $id: {
       email: "Henry.Morgan@caribbean.sea"
    }
    

    P.S. Don't try to save volume by inserting what should be content into the key.
    Premature optimization is the root of all evil (c).

    0 讨论(0)
  • 2020-12-01 13:19

    The reason that adding a child 02/10/2013 creates a structure in Firebase is because the forward slashes are resulting in the creation of a new level.

    So the line I assume you are using something similar to: firebaseRef.child('02/10/2013').set(true) is equivalent to firebaseRef.child('02').child('10').child('2013').set(true).

    To avoid the problems of not being able to use the following characters in reference key names (source),

    • . (period)
    • $ (dollar sign)
    • [ (left square bracket)
    • ] (right square bracket)
    • # (hash or pound sign)
    • / (forward slash)

    we can use one of JavaScript's built in encoding functions since as far as I can tell, Firebase does not provide a built in method to do so. Here's a run-through to see which is the most effective for our purposes:

    var forbiddenChars = '.$[]#/'; //contains the forbidden characters
    escape(forbiddenChars); //results in ".%24%5B%5D%23/"
    encodeURI(forbiddenChars); //results in ".%24%5B%5D%23%2F"
    encodeURIComponent(forbiddenChars); //results in ".%24%5B%5D%23%2F"
    

    Evidently, the most effective solution is encodeURIComponent. However, it doesn't solve all our problems. The . character still poses a problem as shown by the above test and trying to encodeURIComponent your test e-mail address. My suggestion would be to chain a replace function after the encodeURIComponent to deal with the periods.

    Here's what the solution would look like for your two example cases:

    encodeURIComponent('Henry.Morgan@caribbean.sea').replace(/\./g, '%2E') //results in "Henry%2EMorgan%40caribbean%2Esea"
    encodeURIComponent('02/10/2013'); //results in "02%2F10%2F2013"
    

    Since both the final results are safe for insertion into a Firebase as a key name, the only other concern is decoding after reading from a Firebase which can be solved with replace('%2E', '.') and a simple decodeURIComponent(...).

    0 讨论(0)
  • 2020-12-01 13:21

    Character limitations are documented at https://www.firebase.com/docs/creating-references.html - you cannot use '.', '/', '[', ']', '#', and '$' in key names. There is no automatic way of escaping these characters, I'd recommend avoiding their use altogether or creating your own escaping/unescaping mechanism.

    0 讨论(0)
提交回复
热议问题