Guten Abend,
da das Ganze etwas länger geraten ist bitte ich um Verzeihung, aber ich versuche es möglichst verständlich auszudrücken und das kann dann schon etwas umfangreicher werden.
ich hoffe mir kann jemand erklären, was ich hier falsch mache, oder was an meinem Ansatz falsch ist.
Da ich nun doch schon seit einigen Wochen mit SwiftI eine kleine APP fürs iPhone programmiere und ich mich bis jetzt immer erfolgreich verbessert habe (hoffe ich zumindestens), und eigentlich bis jetzt nie aufgegeben habe und nach längerem Suchen immer eine Lösung gefunden habe, bin ich eigentlich mit SwiftUI sehr zufrieden. Bis jetzt. Nun habe ich begonnen, die Daten die ich in der App eingebe, per SwiftData zu speichern. Alles funktioniert eigentlich, wenn da nicht das Thema Datenüberprüfung bei der Eingabe von Daten wäre.
Es ist halt in SwiftUI nicht so einfach möglich Daten während der Eingabe zu überprüfen. Das View Konzept von SwiftUI macht das Ganze nicht einfach. Als Lösung habe ich in der View in der die Daten eingegeben werden einen Button mit einer Funktion eingebaut. Soweit so gut. Nur, da man ja in einer Funktion kein Quer'y Macro verwenden kann, habe ich versucht das per FetchReques zu lösen. Dabei will ich nur feststellen ob es einen Eintrag (in dem Fall Usernamen) bereits in der DB gibt. Die DB habe per SQLITE Kommandos bereits überprüft sieht alles gut aus und wenn ich den Usernamen per SQLITE suche finde ich den auch, aber der FecthRequest gibt mir als Ergebnis, dass der Userrname noch nicht existieren würde.
Ist mein Ansatz das per Fetch Request zu machen nicht der richtige, gibt es andere Lösungsmöglichkeiten, ich kann doch nicht nachdem ich in einer View einen Namen eingegeben habe wieder eine neue View aufrufen Inder die Prüfung erfolgt, wie habt ihr solche Probleme gelöst?
Ich würde mich über jede Antwort freuen die mit irgendwie weiterhilft.
hier meine Beispiel:
Das ist die View mit den Eingaben:
[
Achso, auch vergessen, vielleicht besser doch mal die Datendefinition, wie gesagt diese funktioniert eigentlich
@Model
class fcDB03: Codable, Identifiable {
var fc_UR_UID: UUID
var fc_UR_IniDate: Date
var fc_UR_ModDate: Date
var fc_UR_UseDate: Date
var fc_UR_UFName: String // Vorname
var fc_UR_USName: String // Nachname
var fc_UR_UseName: String // Username
var fc_UR_EMail: String
var fc_UR_PWord: String
var fc_UR_DBNR: String
var fullName: String {
"\(fc_UR_UFName) \(fc_UR_USName)"
}
enum CodingKeys: CodingKey {
case fc_UR_UID, fc_UR_IniDate,fc_UR_ModDate, fc_UR_UseDate, fc_UR_UFName, fc_UR_USName, fc_UR_UseName, fc_UR_EMail, fc_UR_PWord, fc_UR_DBNR
}
init(fc_UR_UID: UUID = UUID(), fc_UR_IniDate: Date = Date(), fc_UR_ModDate: Date = Date(), fc_UR_UseDate: Date = Date(), fc_UR_UFName: String = " ", fc_UR_USName: String = " ", fc_UR_UseName: String = " ", fc_UR_EMail: String = " ", fc_UR_PWord: String = " ", fc_UR_DBNR: String = " ")
{
self.fc_UR_UID = fc_UR_UID
self.fc_UR_IniDate = fc_UR_IniDate
self.fc_UR_ModDate = fc_UR_ModDate
self.fc_UR_UseDate = fc_UR_UseDate
self.fc_UR_UFName = fc_UR_UFName
self.fc_UR_USName = fc_UR_USName
self.fc_UR_UseName = fc_UR_UseName
self.fc_UR_EMail = fc_UR_EMail
self.fc_UR_PWord = fc_UR_PWord
self.fc_UR_DBNR = fc_UR_DBNR
}
// Erforderlich für Decodable (Import)
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.fc_UR_UID = try container.decode(UUID.self, forKey: .fc_UR_UID )
self.fc_UR_IniDate = try container.decode(Date.self, forKey: .fc_UR_IniDate )
self.fc_UR_ModDate = try container.decode(Date.self, forKey: .fc_UR_ModDate )
self.fc_UR_UseDate = try container.decode(Date.self, forKey: . fc_UR_UseDate)
self.fc_UR_UFName = try container.decode(String.self, forKey: .fc_UR_UFName )
self.fc_UR_USName = try container.decode(String.self, forKey: .fc_UR_USName )
self.fc_UR_UseName = try container.decode(String.self, forKey: .fc_UR_UseName )
self.fc_UR_EMail = try container.decode(String.self, forKey: .fc_UR_EMail )
self.fc_UR_PWord = try container.decode(String.self, forKey: .fc_UR_PWord )
self.fc_UR_DBNR = try container.decode(String.self, forKey: .fc_UR_DBNR)
}
// erforderlich für Encodable (Export)
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(fc_UR_UID, forKey: .fc_UR_UID)
try container.encode(fc_UR_IniDate, forKey: .fc_UR_IniDate)
try container.encode(fc_UR_ModDate, forKey: .fc_UR_ModDate)
try container.encode(fc_UR_UseDate, forKey: .fc_UR_UseDate)
try container.encode(fc_UR_UFName, forKey: .fc_UR_UFName)
try container.encode(fc_UR_USName, forKey: .fc_UR_USName)
try container.encode(fc_UR_UseName, forKey: .fc_UR_UseName)
try container.encode(fc_UR_EMail, forKey: .fc_UR_EMail)
try container.encode(fc_UR_PWord, forKey: .fc_UR_PWord)
try container.encode(fc_UR_DBNR, forKey: .fc_UR_DBNR)
}
struct Settings: Codable {
var wishlist, collection, findable: Bool// <-- here wishlist, not s
}
}
Alles anzeigen
Viele Grüße und ich hoffe, ich habe mich verständlich ausgedrückt
ein verzweifelter Anfänger, bitte habt etwas Geduld mit mir, wenn ich etwas vergessen haben sollte werde Ich das dann auf jeden Fall nachreichen. Ich bin auch für Vorschläge
mit anderen Lösungsansätzen offen und dankbar. Vielleicht ist es mit CoreData möglich?
da das Ganze etwas länger geraten ist bitte ich um Verzeihung, aber ich versuche es möglichst verständlich auszudrücken und das kann dann schon etwas umfangreicher werden.
ich hoffe mir kann jemand erklären, was ich hier falsch mache, oder was an meinem Ansatz falsch ist.
Da ich nun doch schon seit einigen Wochen mit SwiftI eine kleine APP fürs iPhone programmiere und ich mich bis jetzt immer erfolgreich verbessert habe (hoffe ich zumindestens), und eigentlich bis jetzt nie aufgegeben habe und nach längerem Suchen immer eine Lösung gefunden habe, bin ich eigentlich mit SwiftUI sehr zufrieden. Bis jetzt. Nun habe ich begonnen, die Daten die ich in der App eingebe, per SwiftData zu speichern. Alles funktioniert eigentlich, wenn da nicht das Thema Datenüberprüfung bei der Eingabe von Daten wäre.
Es ist halt in SwiftUI nicht so einfach möglich Daten während der Eingabe zu überprüfen. Das View Konzept von SwiftUI macht das Ganze nicht einfach. Als Lösung habe ich in der View in der die Daten eingegeben werden einen Button mit einer Funktion eingebaut. Soweit so gut. Nur, da man ja in einer Funktion kein Quer'y Macro verwenden kann, habe ich versucht das per FetchReques zu lösen. Dabei will ich nur feststellen ob es einen Eintrag (in dem Fall Usernamen) bereits in der DB gibt. Die DB habe per SQLITE Kommandos bereits überprüft sieht alles gut aus und wenn ich den Usernamen per SQLITE suche finde ich den auch, aber der FecthRequest gibt mir als Ergebnis, dass der Userrname noch nicht existieren würde.
Ist mein Ansatz das per Fetch Request zu machen nicht der richtige, gibt es andere Lösungsmöglichkeiten, ich kann doch nicht nachdem ich in einer View einen Namen eingegeben habe wieder eine neue View aufrufen Inder die Prüfung erfolgt, wie habt ihr solche Probleme gelöst?
Ich würde mich über jede Antwort freuen die mit irgendwie weiterhilft.
hier meine Beispiel:
Das ist die View mit den Eingaben:
[
Achso, auch vergessen, vielleicht besser doch mal die Datendefinition, wie gesagt diese funktioniert eigentlich
@Model
class fcDB03: Codable, Identifiable {
var fc_UR_UID: UUID
var fc_UR_IniDate: Date
var fc_UR_ModDate: Date
var fc_UR_UseDate: Date
var fc_UR_UFName: String // Vorname
var fc_UR_USName: String // Nachname
var fc_UR_UseName: String // Username
var fc_UR_EMail: String
var fc_UR_PWord: String
var fc_UR_DBNR: String
var fullName: String {
"\(fc_UR_UFName) \(fc_UR_USName)"
}
enum CodingKeys: CodingKey {
case fc_UR_UID, fc_UR_IniDate,fc_UR_ModDate, fc_UR_UseDate, fc_UR_UFName, fc_UR_USName, fc_UR_UseName, fc_UR_EMail, fc_UR_PWord, fc_UR_DBNR
}
init(fc_UR_UID: UUID = UUID(), fc_UR_IniDate: Date = Date(), fc_UR_ModDate: Date = Date(), fc_UR_UseDate: Date = Date(), fc_UR_UFName: String = " ", fc_UR_USName: String = " ", fc_UR_UseName: String = " ", fc_UR_EMail: String = " ", fc_UR_PWord: String = " ", fc_UR_DBNR: String = " ")
{
self.fc_UR_UID = fc_UR_UID
self.fc_UR_IniDate = fc_UR_IniDate
self.fc_UR_ModDate = fc_UR_ModDate
self.fc_UR_UseDate = fc_UR_UseDate
self.fc_UR_UFName = fc_UR_UFName
self.fc_UR_USName = fc_UR_USName
self.fc_UR_UseName = fc_UR_UseName
self.fc_UR_EMail = fc_UR_EMail
self.fc_UR_PWord = fc_UR_PWord
self.fc_UR_DBNR = fc_UR_DBNR
}
// Erforderlich für Decodable (Import)
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.fc_UR_UID = try container.decode(UUID.self, forKey: .fc_UR_UID )
self.fc_UR_IniDate = try container.decode(Date.self, forKey: .fc_UR_IniDate )
self.fc_UR_ModDate = try container.decode(Date.self, forKey: .fc_UR_ModDate )
self.fc_UR_UseDate = try container.decode(Date.self, forKey: . fc_UR_UseDate)
self.fc_UR_UFName = try container.decode(String.self, forKey: .fc_UR_UFName )
self.fc_UR_USName = try container.decode(String.self, forKey: .fc_UR_USName )
self.fc_UR_UseName = try container.decode(String.self, forKey: .fc_UR_UseName )
self.fc_UR_EMail = try container.decode(String.self, forKey: .fc_UR_EMail )
self.fc_UR_PWord = try container.decode(String.self, forKey: .fc_UR_PWord )
self.fc_UR_DBNR = try container.decode(String.self, forKey: .fc_UR_DBNR)
}
// erforderlich für Encodable (Export)
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(fc_UR_UID, forKey: .fc_UR_UID)
try container.encode(fc_UR_IniDate, forKey: .fc_UR_IniDate)
try container.encode(fc_UR_ModDate, forKey: .fc_UR_ModDate)
try container.encode(fc_UR_UseDate, forKey: .fc_UR_UseDate)
try container.encode(fc_UR_UFName, forKey: .fc_UR_UFName)
try container.encode(fc_UR_USName, forKey: .fc_UR_USName)
try container.encode(fc_UR_UseName, forKey: .fc_UR_UseName)
try container.encode(fc_UR_EMail, forKey: .fc_UR_EMail)
try container.encode(fc_UR_PWord, forKey: .fc_UR_PWord)
try container.encode(fc_UR_DBNR, forKey: .fc_UR_DBNR)
}
struct Settings: Codable {
var wishlist, collection, findable: Bool// <-- here wishlist, not s
}
}
Quellcode
- Form {
- Section {
- TextField("Vorname: ", text: $vName)
- TextField("Nachname: ", text: $nName)
- TextField("Username: ", text: $uName)
- .alert(isPresented: $ohneFail){
- return Alert(title: Text("die Eingaben sind falsch"))
- }
- Section {
- Button("Speichern") {
- ohneFail = plausi(ID: eUUID, Vorname: vName, Nachname: nName,Username: uName )
- if ohneFail {
- let newTT = fcDB03(fc_UR_UID: eUUID , fc_UR_IniDate: Date(), fc_UR_ModDate: Date(), fc_UR_UseDate: Date(), fc_UR_UFName: vName, fc_UR_USName: nName, fc_UR_UseName: uName, fc_UR_DBNR: "43")
- modCon.insert(newTT)
- dismiss()
- }
- self.ohneFail.toggle()
- }
- }
- }
- }
- }
- }
- das ist die Plausiprüftng:
- // Eingaben auf Plausibilität überprüfen
- func plausi(ID: UUID, Vorname: String, Nachname: String, Username: String) -> Bool {
- @Environment(\.modelContext) var modCon2
- if Vorname.isEmpty Nachname.isEmpty Username.isEmpty{
- return false }
- else {
- // Beispiel: Überprüfen, ob ein Name schon existiert
- let fetchDescriptor = FetchDescriptor<fcDB03>(predicate: #Predicate { $0.fc_UR_UseName == Username})
- let existingUsers = try? modCon2.fetch(fetchDescriptor)
- if existingUsers?.isEmpty == true {
- return true
- } else {
- print("Benutzer existiert bereits")
- return false
- }
- }
- }
Viele Grüße und ich hoffe, ich habe mich verständlich ausgedrückt
ein verzweifelter Anfänger, bitte habt etwas Geduld mit mir, wenn ich etwas vergessen haben sollte werde Ich das dann auf jeden Fall nachreichen. Ich bin auch für Vorschläge
mit anderen Lösungsansätzen offen und dankbar. Vielleicht ist es mit CoreData möglich?
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Level0 ()