Jacob Cavin
Jacob Cavin

Reputation: 2319

New Line Command (\n) Not Working With Firebase Firestore Database Strings

I'm making an app with Swift and I'm using Firebase Firestore. Firestore is a database that has some strings that I put into a UILabel. With some of my strings, I am using the new line command (or \n). So some of my strings look like this:

"This is line one\nThis is line two\nThis is line three"

But, whenever that string is retrieved, it's addetoto the UILabel and appears like this...

This is line one\nThis is line two\nThis is line three

...when it should be like this...

This is line one

This is line two

This is line three

I'm assuming that \n does not work with strings coming from a database? I've tried double escaping with \\n. Does anyone have a fix for this?

Here is the code that I am using...

    database.collection("songs").whereField("storyTitle", isEqualTo: "This is the story header").getDocuments { (snapshot, error) in
        
        for document in (snapshot?.documents)! {
            self.storyBodyLabel.text = (document.data()["storyBody"] as? String)!
   }
}

Upvotes: 25

Views: 25929

Answers (10)

Harshal Karande
Harshal Karande

Reputation: 498

I noticed that when you add a string with \n to the JSON export and then upload the JSON to the Realtime Database, it acts as a newline. But if you edit that from the firebase console, it gives you back the string with \n and not a newline.

Upvotes: 0

Kevin
Kevin

Reputation: 179

Solution: Add this to your string and you are done (for Java users):

.replace("\\n", "\n")

Example:

    if (dataSnapshot.exists())
    {
    ArrayList<String> userlogs2 = new ArrayList<String>();
    userlogs2.add(dataSnapshot.getValue().toString().replace("\\n", "\n"));
    
    Iterator<String> it2 = userlogs2.iterator();
    

    while (it2.hasNext()) {
    
    appendColoredText(userlogsmessages2, it2.next() + "\n", Color.BLACK);
    
    appendUnderlinedText(userlogsmessages2,"____________" + "\n\n", Color.parseColor("#DB808080"));
    
                                    }

Upvotes: 3

Jacob Cavin
Jacob Cavin

Reputation: 2319

I got it. I simply just replaced the character "\n" from the string that I was receiving with the newline command.

label.text = stringRecived.replacingOccurrences(of: "\n", with: "\n")

Because I manually typed out my string and gave Firebase a string like "Line one\nline two\nline three" I am replacing "\n" with "\n" But if you give Firebase a string like

"Line one
Line two
Line three"

Firebase replaces those returns with "\\n" therfore making the code

label.text = stringRecived.replacingOccurrences(of: "\\n", with: "\n")

Hope that helps!

Upvotes: 25

Phương Nguyễn
Phương Nguyễn

Reputation: 127

You can use CSS whitespace property for \n, it works for me.

white-space: pre-line;

Upvotes: 2

Kumar Santanu
Kumar Santanu

Reputation: 701

100% Working

DB.collection(Global.DB_COLLECTION_PATH).document(NEWS_ID).get().addOnCompleteListener(new OnCompleteListener< DocumentSnapshot >() {
    @Override
    public void onComplete(@NonNull Task< DocumentSnapshot > task) {
        if (task.isSuccessful()) {
            body1 = task.getResult().getString("newsBody").replace("\n", "\n");
            nBody.setText(body1);
        }
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Log.e("DB FAILED", e.getMessage());
    }
});

I hope it's work for you

Upvotes: 0

Shane O&#39;Seasnain
Shane O&#39;Seasnain

Reputation: 3664

Tried all of the answers suggested but none worked for me. In the end, I fixed it by using "/n" in the Firestore record and, in the Swift client, the following:

label.text = stringReceived.replacingOccurrences(of: "/n", with: "\n")

Upvotes: 1

David Somerville
David Somerville

Reputation: 1

I found I could get newlines into a firestore field by using the String.fromCharCode() function. Firestore seems to need special characters in strings to be the actual character ASCII values and does not reinterpret escape characters.

i.e.

"First Line " + String.fromCharCode(13) + "second line"

Upvotes: 0

Monirul Islam
Monirul Islam

Reputation: 1

Firestore add this type----Line one\nline two\nline three

get Sting, replace and show with TextView

String sura=modellist.get(position).getSura().replace( "\n", "\n");

Working..

Upvotes: -1

Etienne Salimbeni
Etienne Salimbeni

Reputation: 582

For me firebase turned all \n to \\\\n , so I just reversed that change with :

theString.replaceAll( "\\\\n", "\n" );

Just posting cause I wasted some time calculating the right number of '\'

Upvotes: 0

Doug Stevenson
Doug Stevenson

Reputation: 317392

Firestore doesn't support any escape sequences within string values. If you write "\n" in a string, you're going to get exactly that back when you read it. If you need to store something special, you may want to encode and decode that yourself.

Upvotes: 1

Related Questions