Created
April 24, 2021 09:43
-
-
Save IniongunIsaac/5d506cb43706eecdb5330b1110ba528c to your computer and use it in GitHub Desktop.
A combination of Realm and Rx with easy, out of the box CRUD abstractions. Depends on 'RealmSwift, RxRealm and RxSwift'
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RxSwift | |
import RealmSwift | |
import RxRealm | |
class BaseRealmDatasource { | |
var kRealm: Realm { preconditionFailure("Subclass of BaseRealmDatasource must provide an instance of Realm!") } | |
func getAll<T: Object>(obj: T.Type) -> Observable<[T]> { | |
Observable.array(from: kRealm.objects(T.self)) | |
} | |
func insert<T: Object>(objs: [T]) -> Observable<Void> { | |
kRealm.insertItems(items: objs) | |
} | |
func delete<T: Object>(objs: [T]) -> Observable<Void> { | |
kRealm.deleteItems(items: objs) | |
} | |
func deleteAll<T: Object>(obj: T.Type) -> Observable<Void> { | |
kRealm.deleteAllItems(for: T.self) | |
} | |
func getById<T: Object>(obj: T.Type, id: Any) -> Observable<T> { | |
Observable.from(optional: kRealm.object(ofType: T.self, forPrimaryKey: id)) | |
} | |
func getByProperty<T: Object>(obj: T.Type, property: String, value: Any) -> Observable<T> { | |
Observable.from(optional: kRealm.objects(T.self).filter("\(property) LIKE %@", value).first) | |
} | |
func getByPropertyList<T: Object>(obj: T.Type, property: String, value: Any) -> Observable<[T]> { | |
Observable.from(optional: kRealm.objects(T.self).filter("\(property) LIKE %@", value).toArray()) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RealmSwift | |
import RxSwift | |
extension Realm { | |
func insertItems<T: Object>(items: [T]) -> Observable<Void> { | |
return Observable<Void>.create { observer in | |
do { | |
try self.write { | |
self.add(items, update: .modified) | |
} | |
observer.onNext(()) | |
} catch { | |
observer.onError(error) | |
} | |
return Disposables.create() | |
} | |
} | |
func updateItems<T: Object>(items: [T]) -> Observable<Void> { | |
return Observable<Void>.create { observer in | |
do { | |
try self.write { | |
self.add(items, update: .modified) | |
} | |
observer.onNext(()) | |
} catch { | |
observer.onError(error) | |
} | |
return Disposables.create() | |
} | |
} | |
func deleteItems<T: Object>(items: [T]) -> Observable<Void> { | |
return Observable<Void>.create { observer in | |
do { | |
try self.write { | |
self.delete(items) | |
} | |
observer.onNext(()) | |
} catch { | |
observer.onError(error) | |
} | |
return Disposables.create() | |
} | |
} | |
func deleteAllItems<T: Object>(items: Results<T>) -> Observable<Void> { | |
return Observable<Void>.create { observer in | |
do { | |
try self.write { | |
self.delete(items) | |
} | |
observer.onNext(()) | |
} catch { | |
observer.onError(error) | |
} | |
return Disposables.create() | |
} | |
} | |
func deleteAllItems<T: Object>(for type: T.Type) -> Observable<Void> { | |
return Observable<Void>.create { observer in | |
do { | |
try self.write { | |
self.delete(self.objects(type)) | |
} | |
observer.onNext(()) | |
} catch { | |
observer.onError(error) | |
} | |
return Disposables.create() | |
} | |
} | |
func getSingleElement<T: Object>(primaryKeyValue: String) -> Observable<T?> { | |
return Observable<T?>.create { observer in | |
observer.onNext(self.object(ofType: T.self, forPrimaryKey: primaryKeyValue)) | |
return Disposables.create() | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment