PredicateFlow alternatives and similar libraries
Based on the "Core Data" category.
Alternatively, view PredicateFlow alternatives based on common mentions on social networks and blogs.
-
CoreStore
Unleashing the real power of Core Data with the elegance and safety of Swift -
QueryKit
A simple CoreData query language for Swift and Objective-C. -
encrypted-core-data
v2.0 - iOS Core Data encrypted SQLite store using SQLCipher -
AlecrimCoreData
A powerful and simple Core Data wrapper framework written in Swift. -
Graph
Graph is a semantic database that is used to create data-driven applications. -
PrediKit
An NSPredicate DSL for iOS, OSX, tvOS, & watchOS. Inspired by SnapKit and lovingly written in Swift. -
AERecord
Super awesome Swift minion for Core Data (iOS, macOS, tvOS) -
DATAStack
100% Swift Simple Boilerplate Free Core Data Stack. NSPersistentContainer -
ios-queryable
ios-queryable is an implementation of IQueryable/IEnumerable for Core Data -
Skopelos
A minimalistic, thread safe, non-boilerplate and super easy to use version of Active Record on Core Data. Simply all you need for doing Core Data. Swift flavour. -
HardCoreData
CoreData stack and controller that will never block UI thread -
JustPersist
JustPersist is the easiest and safest way to do persistence on iOS with Core Data support out of the box. It also allows you to migrate to any other persistence framework with minimal effort. -
SLRESTfulCoreData
Objc naming conventions, autogenerated accessors at runtime, URL substitutions and intelligent attribute mapping -
CloudCore
Robust CoreData-CloudKit synchronization, including offline queuing, relationships, private, shared and public databases, field-level deltas, encrypted values, maskable attributes, cacheable assets, and more. -
Cadmium
A Swift framework that wraps CoreData, hides context complexity, and helps facilitate best practices. -
CWCoreData
Additions and utilities to make it concurrency easier with the Core Data framework. -
CoreDataDandy
A feature-light wrapper around Core Data that simplifies common database operations. -
Core Data Query Interface
A type-safe, fluent Swift library for working with Core Data
InfluxDB - Power Real-Time Data Analytics at Scale
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of PredicateFlow or a related project?
README
PredicateFlow
Write amazing, strong-typed and easy-to-read NSPredicate. This library allows you to write flowable NSPredicate, without guessing attribution names, predicate operation or writing wrong arguments type.
Supported platforms
- iOS 9.0+
- macOS 10.9+
- tvOS 9.0+
- watchOS 2.0+
Installation
CocoaPods is actually the only way to install it.
Cocoapods
CocoaPods 0.39.0+ is required to build this library
- Add
pod 'PredicateFlow'
to your Podfile and runpod install
- In Xcode, click on your project in the file list, choose your target under
TARGETS
, click theBuild Phases
tab and add aNew Run Script Phase
by clicking the plus icon in the top left - Drag the new
Run Script
phase above theCompile Sources
phase and belowCheck Pods Manifest.lock
, expand it and paste the following script:
"$PODS_ROOT/Sourcery/bin/sourcery" --sources "$PODS_ROOT/PredicateFlow/PredicateFlow/Classes/Utils/" --sources "$SRCROOT" --templates "$PODS_ROOT/PredicateFlow/PredicateFlow/Templates/PredicateFlow.stencil" --output "$SRCROOT/PredicateFlow.generated.swift"
In case you are using PredicateFlow-Realm, past the following script instead of the above one:
"$PODS_ROOT/Sourcery/bin/sourcery" --sources "$PODS_ROOT/PredicateFlow/PredicateFlow/Classes/Utils/" --sources "$SRCROOT" --sources "$PODS_ROOT/RealmSwift" --templates "$PODS_ROOT/PredicateFlow/PredicateFlow/Templates/PredicateFlow-Realm.stencil" --output "$SRCROOT/PredicateFlow.generated.swift"
For Xcode 10 only, add a new Output Files
and paste the following:
$SRCROOT/PredicateFlow.generated.swift
- Build your project. In Finder you will now see a
PredicateFlow.generated.swift
in the$SRCROOT
-folder, drag thePredicateFlow.generated.swift
files into your project and uncheckCopy items if needed
Tip: Add the *.generated.swift
pattern to your .gitignore
file to prevent unnecessary conflicts.
Usage
Define a class/struct with its own attributes, which implements PredicateSchema
:
import PredicateFlow
class Dog: PredicateSchema {
private var name: String = ""
private var age: Int = 0
private var isHungry: Bool = false
private var owner: Person?
}
class Person: PredicateSchema {
enum Sex {
case male
case female
}
private var name: String = ""
private var birth: Date?
private var sex: Sex!
private var dogs: [Dog] = []
}
Build the project. PredicateFlow will autogenerate attributes references to build predicates, putting them in structures.
// Generated using Sourcery 0.10.0 — https://github.com/krzysztofzablocki/Sourcery
// DO NOT EDIT
import PredicateFlow
/// The "Dog" Predicate Schema
internal struct DogSchema: GeneratedPredicateSchema {
private var compoundFieldBuilder: CompoundFieldBuilder
/// DO NOT USE THIS INIT DIRECTLY!
internal init(compoundFieldBuilder: CompoundFieldBuilder) {
self.compoundFieldBuilder = compoundFieldBuilder
}
/// "name" property
internal var name: StringPredicateProperty { return builder.string("name") }
/// "name" property for static access
internal static var name: StringPredicateProperty { return DogSchema().name }
// Other properties of Dog class autogenerated...
}
/// The "Person" Predicate Schema
internal struct PersonSchema: GeneratedPredicateSchema {
private var compoundFieldBuilder: CompoundFieldBuilder
/// DO NOT USE THIS INIT DIRECTLY!
internal init(compoundFieldBuilder: CompoundFieldBuilder) {
self.compoundFieldBuilder = compoundFieldBuilder
}
/// "name" property
internal var name: StringPredicateProperty { return builder.string("name") }
/// "name" property for static access
internal static var name: StringPredicateProperty { return PersonSchema().name }
// Other properties of Person class autogenerated...
}
To type a floawable NSPredicate, just write:
DogSchema.age.isEqual(10).query()
// or
// Vanilla mode:
// NSPredicate("age == %@", 10)
You can also write compound predicate, and use deeper fields:
PredicateBuilder(DogSchema.age > 10)
.and(DogSchema.isHungry.isTrue)
.and(DogSchema.age.between(1, 10))
.and(DogSchema.owner.element().name == "Foo")
.or(DogSchema.owner.element().dogs.maxElements().age > 10)
.or(DogSchema.owner.element().dogs.anyElements().name == "Foo")
.build()
// Vanilla mode:
// NSPredicate("age > %@ AND isHungry == %@ AND age BETWEEN %@ AND owner.name == %@ OR [email protected] > %@ OR ANY owner.dogs.name == %@", 10, true, [1, 10], "Foo", 10, "Foo")
PredicateFlow can also build KeyPaths, and you can use it to get a strong-typed one.
DogSchema.age.keyPath()
DogSchema.owner.element().dogs.keyPath()
// Vanilla mode:
// "age"
// "owner.dogs"
PredicateFlow/Realm
If you want to use flowable and strong-typed queries in Realm, add both pod 'PredicateFlow'
and pod 'PredicateFlow/Realm'
to your Podfile and run pod install
.
let realm = try! Realm()
realm.objects(Dog.self)
.filter(DogSchema.age.isGreater(than: 10))
.filter(DogSchema.isHungry.isTrue)
.sorted(DogSchema.age.ascending())
// Vanilla mode:
realm.objects(Dog.self)
.filter("age > %@", 10)
.filter("isHungry == %@", true)
.sorted("age", ascending: true)
Contributing
PredicateFlow is an open source project, so feel free to contribute. You can open an issue for problems or suggestions, and you can propose your own fixes by opening a pull request with the changes.
License
PredicateFlow is available under the MIT license. See the LICENSE file for more info.
Attributions
This library is powered by Sourcery.
Author
Andrea Del Fante, [email protected]
*Note that all licence references and agreements mentioned in the PredicateFlow README section above
are relevant to that project's source code only.