FFDataBaseModel.m 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // FIDDataBaseModel.m
  3. // FFDB
  4. //
  5. // Created by Fidetro on 2017/3/22.
  6. // Copyright © 2017年 Fidetro. All rights reserved.
  7. //
  8. // https://github.com/Fidetro/FFDB
  9. #import "FFDataBaseModel.h"
  10. #import "FFDataBaseModel+Sqlite.h"
  11. #import "FFDataBaseModel+Custom.h"
  12. #import "NSObject+FIDProperty.h"
  13. NSString const* kUpdateContext = @"kUpdateContext";
  14. @interface FFDataBaseModel ()
  15. @property(nonatomic,strong,readwrite) NSString *primaryID;
  16. @end
  17. @implementation FFDataBaseModel
  18. + (NSArray <__kindof FFDataBaseModel *>*)selectFromClassAllObject
  19. {
  20. return [[self class] selectFromClassPredicateWithFormat:nil];
  21. }
  22. + (NSArray <__kindof FFDataBaseModel *>*)selectFromClassPredicateWithFormat:(NSString *)format
  23. {
  24. return [FFDBManager selectColumns:nil fromClass:[self class] SQLStatementWithFormat:format];
  25. }
  26. + (BOOL)deleteFromClassAllObject
  27. {
  28. return [[self class]deleteFromClassPredicateWithFormat:nil];
  29. }
  30. - (BOOL)deleteObject
  31. {
  32. return [[self class]deleteFromClassPredicateWithFormat:[self deleteObjectSqlstatement]];
  33. }
  34. + (BOOL)deleteFromClassPredicateWithFormat:(NSString *)format
  35. {
  36. return [FFDBManager deleteFromClass:[self class] SQLStatementWithFormat:format];
  37. }
  38. - (BOOL)insertObject
  39. {
  40. NSArray *propertyNames = [[self class]columnsOfSelf];
  41. return [FFDBManager insertObject:self columns:propertyNames];
  42. }
  43. - (BOOL)insertObjectWithColumns:(NSArray *)columns
  44. {
  45. return [FFDBManager insertObject:self columns:columns];
  46. }
  47. + (BOOL)updateFromClassPredicateWithFormat:(NSString *)format
  48. {
  49. return [FFDBManager updateFromClass:[self class] SQLStatementWithFormat:format];
  50. }
  51. - (BOOL)updateObject
  52. {
  53. NSArray *propertyNames = [[self class]columnsOfSelf];
  54. return [FFDBManager updateObject:self columns:propertyNames];
  55. }
  56. - (BOOL)upsert
  57. {
  58. if ([self.primaryID length] == 0)
  59. {
  60. return [self insertObject];
  61. }
  62. else
  63. {
  64. return [self updateObject];
  65. }
  66. }
  67. - (BOOL)upsertWithColumns:(NSArray *)columns
  68. {
  69. if (columns.count == 0)
  70. {
  71. return [self upsert];
  72. }
  73. else
  74. {
  75. long long int totalCount = [FFDBManager selectCountfromClasses:@[[self class]] SQLStatementWithFormat:[NSString stringWithFormat:@" where %@",[self stringWithWhereValueOfColumns:columns]]];
  76. if (totalCount == 0)
  77. {
  78. [self insertObject];
  79. }
  80. else
  81. {
  82. [self updateObject];
  83. }
  84. return YES;
  85. }
  86. }
  87. - (BOOL)updateObjectSetColumns:(NSArray *)columns
  88. {
  89. return [FFDBManager updateObject:self columns:columns];
  90. }
  91. - (void)updateObjectWithBlock:(void(^)())update_block
  92. {
  93. NSArray *propertyNames = [[self class]columnsOfSelf];
  94. if (update_block)
  95. {
  96. for (NSString *propertyName in propertyNames)
  97. {
  98. [self addObserver:self forKeyPath:propertyName options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:&kUpdateContext];
  99. }
  100. update_block();
  101. for (NSString *propertyName in propertyNames)
  102. {
  103. [self removeObserver:self forKeyPath:propertyName];
  104. }
  105. }
  106. }
  107. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
  108. {
  109. if (context == &kUpdateContext)
  110. {
  111. [self updateObjectSetColumns:@[keyPath]];
  112. }
  113. }
  114. #pragma mark - --------------------------base method--------------------------
  115. + (void)initialize
  116. {
  117. if ([NSStringFromClass([self class])isEqualToString:@"FFDataBaseModel"])
  118. {
  119. return;
  120. }
  121. else if ([NSStringFromClass([self class])rangeOfString:@"NSKVONotifying"].location != NSNotFound)
  122. {
  123. return;
  124. }
  125. else
  126. {
  127. [FFDBManager createTableFromClass:self];
  128. [FFDBManager alterFromClass:self columns:nil];
  129. }
  130. }
  131. @end