2017-06-30 6 views
2

Ich bin auf der Suche nach einer Möglichkeit, separate Dateien zu erstellen. Zum Beispiel: Ich habe eine Anwendung, die ein Formular wie Name, Datum usw. hat und wenn ich Speichern drücke, möchte ich alle Informationen in dieser Form des Benutzers in eine Datei speichern. Jedes Mal, wenn das Formular ausgefüllt wird, möchte ich für jeden Benutzer eine neue Datei erstellen. Die Datei wird im Dokumentenverzeichnis der Anwendung gespeichert. Der Name der Datei sollte aus dem Textfeld 'name' des Formulars stammen. Ich habe nach Wegen gesucht, Dateien in swift zu erstellen, aber der Dateiname ist immer fest in der Pfad-URL geschrieben und jedes Mal, wenn das Formular ausgefüllt wird, wird die Information in der gleichen Datei gespeichert. Ich möchte das nicht tun. Jede Lösung oder jeder Rat wird geschätzt, ich kann online scheinbar keine Lösung finden (nur wie ich eine Datei mit einem fest codierten Dateinamen erstelle, was ich bereits machen kann).Erstellen separater Dateien

import UIKit 

class FormViewController: UIViewController { 

    @IBOutlet weak var organdonationno: UITextField! 
    @IBOutlet weak var donorage: UITextField! 
    @IBOutlet weak var snodname: UITextField! 
    @IBOutlet weak var donorshospital: UITextField! 
    @IBOutlet weak var date: UITextField! 
    @IBOutlet weak var ID: UITextField! 

    var fileMgr: FileManager = FileManager.default 
    var docsDir: String? 
    var dataFile: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let filemgr = FileManager.default 
     let dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask) 
     dataFile = dirPaths[0].appendingPathComponent("path").path 
     if filemgr.fileExists(atPath: dataFile!) { 
      let databuffer1 = filemgr.contents(atPath: dataFile!) 
      let databuffer2 = filemgr.contents(atPath: dataFile!) 
      let databuffer3 = filemgr.contents(atPath: dataFile!) 
      let databuffer4 = filemgr.contents(atPath: dataFile!) 
      let databuffer5 = filemgr.contents(atPath: dataFile!) 

      let datastring1 = NSString(data: databuffer1!, encoding: String.Encoding.utf8.rawValue) 
      let datastring2 = NSString(data: databuffer2!, encoding: String.Encoding.utf8.rawValue) 
      let datastring3 = NSString(data: databuffer3!, encoding: String.Encoding.utf8.rawValue) 
      let datastring4 = NSString(data: databuffer4!, encoding: String.Encoding.utf8.rawValue) 
      let datastring5 = NSString(data: databuffer5!, encoding: String.Encoding.utf8.rawValue) 

      organdonationno.text = datastring1 as? String 
      donorage.text = datastring2 as? String 
      snodname.text = datastring3 as? String 
      donorshospital.text = datastring4 as? String 
      date.text = datastring5 as? String 
     } 
     // Do any additional setup after loading the view. 
    } 

    @IBAction func savdata(_ sender: Any) { 
     let databuffer1 = (organdonationno.text)!.data(using: String.Encoding.utf8) 
     let databuffer2 = (donorage.text)!.data(using: String.Encoding.utf8) 
     let databuffer3 = (snodname.text)!.data(using: String.Encoding.utf8) 
     let databuffer4 = (donorshospital.text)!.data(using: String.Encoding.utf8) 
     let databuffer5 = (date.text)!.data(using: String.Encoding.utf8) 

     fileMgr.createFile(atPath: dataFile!, contents: databuffer1, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer2, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer3, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer4, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer5, attributes: nil) 

    } 
} 
+1

Dateiname nicht harcodieren. Der Name der Datei sollte aus dem 'Name' + 'Datum' + 'creationTime' des Formulars stammen. Das macht einen eindeutigen Dateinamen. – luckyShubhra

+0

zeigen Sie uns Ihren Arbeitscode. Es wäre hilfreich. – luckyShubhra

+0

@luckySubhra Ich habe den Code hinzugefügt, es funktioniert nicht richtig, da es nur das Datum speichert, aber nicht den Rest der Informationen aus dem Formular speichert. Bitte ertragen Sie mit mir, wenn irgendwelche Fehler ich bin ein Neuling. Danke – Aneesa

Antwort

1

Es spart nur Termine, weil Sie mit dem gleichen Dateinamen für jedes Feld erstellen. Es wird jedes Mal von einer neuen Datei überschrieben. Die letzte Datei, die Sie erstellen, ist das Datum, daher bleibt nur das Datum bestehen. Wenn Sie alle Formulardaten für einen Benutzer speichern möchten, können Sie dies wie folgt tun. Sie müssen einen dynamischen Dateinamen für jedes Formular erstellen, damit es überschrieben wird.

@IBAction func savdata(_ sender: Any) { 

let fileName="\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) " 

let file = "\(fileName).txt" //this is the file. we will write to and read from it 

let text = fileName //just a text 

if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { 

let path = dir.appendingPathComponent(file) 

//writing 
do { 
    try text.write(to: path, atomically: false, encoding: String.Encoding.utf8) 
    } 
    catch {/* error handling here */} 

    //reading 
    do { 
    let text2 = try String(contentsOf: path, encoding: String.Encoding.utf8) 
    } 
catch {/* error handling here */} 
} 

------ -------- EDIT

Optional Wort entfernen zwingen zu müssen, um den Wert auszupacken durch Ausrufezeichen (!) Nach dem Objekt müssen sich auspacken.

var canBeNil : String? = "shubhra" 
print(canBeNil) // output Optional("shubhra") 
print(canBeNil!) // output shubhra 

wenn Sie Titel wie organdonationno gerade bearbeiten müssen:

let fileName="\(organdonationno.text)" 
let text = "\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) " 

So stellen Sie sicher, dass der Dateiname eindeutig ist, damit nicht überschrieben wird.

Ich hoffe, es hilft. Glückliche Kodierung !!

+0

Hallo, vielen Dank dafür kann ich Ihre Hilfe für etwas anderes zu diesem Thema fragen, wenn möglich. Wenn ich ein Bild in dieser Datei speichern möchte, wie kann ich dies von einem anderen View-Controller aus tun. Wenn ich zum Beispiel die allgemeinen Details in der .txt-Datei gespeichert habe, möchte ich ein Bild machen und dieses Bild dann in der gleichen Datei speichern. Wie kann ich wählen, diese bestimmten Daten in die gleiche Datei zu senden. Vielen Dank für Ihre Unterstützung sehr geschätzt. – Aneesa

+0

@Aneesa Ich werde froh sein zu helfen. Sie müssen dies als neue SO-Fragen veröffentlichen. – luckyShubhra

1

Meine Lösung scheint oben ähnlich. Sie sollten besser die Informationen Ihrer Benutzereingabe aus Textfeldern verwenden, um einen eindeutigen Namen Ihrer Datei zu organisieren. Und ich empfehle Ihnen dringend, ein Modell zu schreiben, um Ihre Eigenschaft zu speichern, und tun Sie den Speichern auf Festplatte Job für Ihre Codierung Klarheit. Ich kann Ihnen ein Beispiel geben ich auf meinem Spielplatz gerade geschrieben:

struct User { 
let organdonationno: NSString 
let donorage: NSString 
let snodName: NSString 
let donorshospital: NSString 
let date: NSString 
let ID: NSString 

func saveToJSONFile() { 
    guard let documentDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 

    let pathComponent = ID.appending(".json") 

    let array = NSArray(array: [organdonationno, donorage, snodName, donorshospital, date, ID]) 

    let fileURL = documentDirectoryUrl.appendingPathComponent(pathComponent) 

    do { 
     let data = try JSONSerialization.data(withJSONObject: array, options: []) 
     try data.write(to: fileURL, options: .atomic) 
    } 
    catch { 
     print(error) 
    } 
} 

}

Der Code ich schreibe ist die Eigenschaften der Struktur setzen in eine NSArray, dass es leicht als JSON-Objekt serialisiert werden. JSON ist eine Art gut angezeigter Datenstruktur. Wenn es in Ihre Datei geschrieben wird, können Sie die .json-Datei öffnen, um nach innen zu sehen. Es wird wie [ string1, string2, string3, string4, string5, string6] Sache sein, die ziemlich einfach zu verstehen ist.
und Sie können es auf diese Weise verwenden:

let user = User(organdonationno: datastring1, donorage: datastring2, snodName: datastring3, donorshospital: datastring4, date: datastring5, ID: datastring6) 
user.saveToJSONFile() 

Wenn Sie swift 4 verwenden, gibt es eine bequeme Möglichkeit, die User Struktur in zu JSON-Objekt zu drehen. Sie müssen nur die User konform zu Codable, und die zugrunde liegende Implementierung des Apple wird die ganze Arbeit tun.

Struct User: Codable { 
+0

Vielen Dank für dieses Beispiel. Allerdings bekomme ich diesen Fehler, wenn ich den Code ausführe. "Der Ausdruck war zu komplex, um in angemessener Zeit gelöst werden zu können. Man sollte die Ausdrücke in einzelne Unterausdrücke aufteilen." Dies ist für den Pfadnamen "let pathComponent = organdonationno + donorage + snodName + donershospital + Datum + ID +" .json " ". Irgendwelche Lösungen, wie ich diesen Fehler beheben kann. Was wäre, wenn ich nur die ID als Name der .json-Datei hätte? Ich habe das versucht, aber eine Menge Fehler bekommen. – Aneesa

+0

Das ist mein Fehler, ich habe es zu schnell geschrieben, um herauszufinden, dass der Typ dieser string-basierten Eigenschaften NSString ist. Und in NSString gibt es keinen solchen '+' Operator. Sie sollten diese Zeile also in 'let pathComponent = ID.appending (". Json ")' ändern – Turtleeeeee

Verwandte Themen