ไม่สามารถกรองหลังจากวันที่ใน Realm รวดเร็ว

ฉันกำลังพยายามใช้ตัวกรองในขอบเขตซึ่งรวมถึงวันที่ แต่ไม่มีโชค

ฉันพบว่าไม่สามารถส่งวัตถุ Date ได้เนื่องจากรูปแบบ %@ คาดว่าวัตถุ Foundation เป็นอาร์กิวเมนต์ ดังนั้นฉันจึงใช้การส่งแบบหล่อกับ NSDate

let newDate = Date()
realm.objects(E.self)
            .filter(String(format: "%@ <= %@", key, newDate as NSDate)).first

ปัญหาที่ปรากฏคือ "ไม่สามารถแยกวิเคราะห์การประทับเวลาสตริงรูปแบบ==2020-03-20 08:21:00 +0000"

key คือชื่อของฟิลด์ ซึ่งในกรณีนี้คือ "การประทับเวลา" และในโมเดลจะมีประเภทเป็น Date

การป้อนข้อมูลใด ๆ ที่ชื่นชม

ขอบคุณ


person hepifish    schedule 20.03.2020    source แหล่งที่มา
comment
ฉันคิดว่าคุณตั้งใจจะเขียน .filter("\(key) <= %@", newDate as NSDate)?   -  person Sweeper    schedule 20.03.2020
comment
ฉันเคยใช้ .filter(String(format: "%@ = '%@'", key, value)).first สำเร็จแล้ว แต่เป็นแบบสตริง ไม่ใช่วันที่ ฉันไม่แน่ใจ 100% ว่ามันควรทำอย่างไร แต่ฉันจะลองทำตามคำแนะนำของคุณเช่นกัน ขอบคุณ   -  person hepifish    schedule 20.03.2020
comment
@Sweeper ดูเหมือนว่าจะใช้งานได้ แต่ฉันไม่แน่ใจว่าทำไม :)) คุณช่วยกรุณาโพสต์คำตอบด้วยสิ่งนี้และอาจเป็นคำอธิบายเพื่อที่ฉันจะทำเครื่องหมายได้อย่างถูกต้อง?   -  person hepifish    schedule 20.03.2020


คำตอบ (1)


คุณควรใช้:

.filter("\(key) <= %@", newDate as NSDate)

นี่เป็นการเรียกเมธอด filter ของ Realm โอเวอร์โหลดซึ่งยอมรับรูปแบบและอาร์กิวเมนต์

String(format:) ไม่ใช่สิ่งที่ถูกต้องที่จะใช้ที่นี่ เนื่องจากเป็นเพียงการจัดรูปแบบสตริงทั่วไป แต่ที่นี่ คุณต้องการให้จัดรูปแบบวันที่ตามกฎของรูปแบบ NSPredicate ในทางกลับกัน key สามารถสอดแทรกลงในสตริงได้ เนื่องจากชื่อของคอลัมน์ตารางไม่ต้องการรูปแบบพิเศษ

หาก key มาจาก UITextField หรืออะไรทำนองนั้น คุณอาจต้องระวังการโจมตีแบบฉีดด้วยเช่นกัน และตรวจสอบและ/หรือหลีกเลี่ยง key อย่างเหมาะสมล่วงหน้า

person Sweeper    schedule 20.03.2020
comment
ขอบคุณมาก คีย์มาจากบริการภายใน react-native ดังนั้นฉันไม่คิดว่ามันจะเป็นปัญหา - person hepifish; 20.03.2020