Skip to content

Commit 19c1851

Browse files
committed
添加了一个查询方法和一个更新方法
1 parent 1e9509b commit 19c1851

File tree

8 files changed

+70
-20
lines changed

8 files changed

+70
-20
lines changed

.DS_Store

0 Bytes
Binary file not shown.

SJDBMap.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Pod::Spec.new do |s|
33
s.name = "SJDBMap"
4-
s.version = "1.2.0.2"
4+
s.version = "1.2.0.3"
55
s.summary = "Automatically create tables based on the model."
66
s.description = "https://github.com/changsanjiang/SJDBMap/blob/master/README.md"
77
s.homepage = "https://github.com/changsanjiang/SJDBMap"

SJDBMap/DatabaseMapping/SJDatabaseFunctions.m

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#import "SJDatabaseFunctions.h"
1010
#import <objc/message.h>
1111

12-
#define DEBUG_CONDITION (0)
12+
#define DEBUG_CONDITION (1)
1313

1414
NS_ASSUME_NONNULL_BEGIN
1515

@@ -52,32 +52,42 @@ void sj_transaction(sqlite3 *database, void(^sync_task)(void)) {
5252
}
5353
void sj_transaction_begin(sqlite3 *database) {
5454
sqlite3_exec(database, "begin", 0, 0, 0);
55+
#if DEBUG_CONDITION
5556
printf("\n开启事物!\n");
57+
#endif
5658
}
5759
void sj_transaction_commit(sqlite3 *database) {
5860
sqlite3_exec(database, "commit", 0, 0, 0);
61+
#if DEBUG_CONDITION
5962
printf("\n提交事物!\n");
63+
#endif
6064
}
6165

6266
#pragma mark sql
6367
static NSArray <id> *__nullable static_sj_sql_data(sqlite3_stmt *stmt, Class __nullable cls);
6468

6569
bool sj_sql_exe(sqlite3 *database, const char *sql) {
66-
char sql_str[strlen(sql) + 1];
70+
char sql_str[(strlen(sql) + 1) * sizeof(char)];
6771
strcpy(sql_str, sql);
6872
char *error = NULL;
6973
bool r = (SQLITE_OK == sqlite3_exec(database, sql_str, NULL, NULL, &error));
7074
if ( error != NULL ) { printf("\nError ==> \n SQL : %s\n Error: %s\n", sql_str, error); sqlite3_free(error);}
75+
#if DEBUG_CONDITION
76+
printf("\n Exe: %s\n", sql_str);
77+
#endif
7178
return r;
7279
}
7380
extern NSArray<id> *__nullable sj_sql_query(sqlite3 *database, const char *sql, Class __nullable cls) {
74-
char sql_str[strlen(sql) + 1];
81+
char sql_str[(strlen(sql) + 1) * sizeof(char)];
7582
strcpy(sql_str, sql);
7683
sqlite3_stmt *pstmt = NULL;
7784
bool result = (SQLITE_OK == sqlite3_prepare_v2(database, sql_str, -1, &pstmt, NULL));
7885
NSArray <NSDictionary *> *dataArr = nil;
7986
if (result) dataArr = static_sj_sql_data(pstmt, cls);
8087
sqlite3_finalize(pstmt);
88+
#if DEBUG_CONDITION
89+
printf("\n Query: %s \n", sql_str);
90+
#endif
8191
return dataArr;
8292
}
8393

@@ -138,7 +148,6 @@ bool sj_table_create(sqlite3 *database, SJDatabaseMapTableCarrier * carrier) {
138148
printf("\n创建失败: %s \nSQL: %s\n", table_name, sql_strM.UTF8String);
139149
}
140150
#endif
141-
142151
return result;
143152
}
144153
bool sj_table_update(sqlite3 *database, SJDatabaseMapTableCarrier * carrier) {
@@ -330,14 +339,7 @@ bool sj_value_insert_or_update(sqlite3 *database, id<SJDBMapUseProtocol> model,
330339
result = r;
331340
return;
332341
}
333-
334-
if ( !carrier_arr.isUsingPrimaryKey ) {
335-
long long autoId = [[obj valueForKey:carrier_arr.autoincrementPrimaryKey] integerValue];
336-
if ( autoId == 0 ) { // 如果是自增主键, 防止重新插入, 在这里将其自增主键赋值
337-
autoId = sj_value_last_id(database, _arr_e_cls, carrier_arr);
338-
[obj setValue:@(autoId) forKey:carrier_arr.autoincrementPrimaryKey];
339-
}
340-
}
342+
341343
[corkey_primary_key_idsM addObject:[obj valueForKey:carrier_arr.primaryKeyOrAutoincrementPrimaryKey]];
342344
}];
343345

@@ -375,8 +377,15 @@ bool sj_value_insert_or_update(sqlite3 *database, id<SJDBMapUseProtocol> model,
375377
[sql_strM appendFormat:@") %@);", sql_valuesM];
376378

377379
sj_sql_exe(database, sql_strM.UTF8String);
378-
379-
printf("\n --- %s \n ", sql_strM.UTF8String);
380+
381+
// 如果是自增主键, 防止重新插入, 在这里将其自增主键赋值
382+
if ( !carrier.isUsingPrimaryKey ) {
383+
long long autoId = [[(id)model valueForKey:carrier.autoincrementPrimaryKey] integerValue];
384+
if ( autoId == 0 ) {
385+
autoId = sj_value_last_id(database, [model class], carrier);
386+
[(id)model setValue:@(autoId) forKey:carrier.autoincrementPrimaryKey];
387+
}
388+
}
380389
return result;
381390
}
382391
long long sj_value_last_id(sqlite3 *database, Class<SJDBMapUseProtocol> cls, SJDatabaseMapTableCarrier *__nullable carrier) {

SJDBMap/DatabaseMapping/SJDatabaseMap+RealTime.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ NS_ASSUME_NONNULL_BEGIN
2626
- (BOOL)insertOrUpdateDataWithModels:(NSArray<id<SJDBMapUseProtocol>> *)models;
2727
/// 提供需要更新的字段, 提高执行效率
2828
- (BOOL)update:(id<SJDBMapUseProtocol>)model properties:(NSArray<NSString *> *)properties;
29+
- (BOOL)updates:(NSArray<id<SJDBMapUseProtocol>> *)models properties:(NSArray<NSString *> *)properties;
2930

3031
#pragma mark delete
3132
/// 根据主键删除
@@ -36,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
3637
- (BOOL)deleteDataWithClass:(Class)cls;
3738

3839
#pragma mark query
40+
- (nullable NSArray<id<SJDBMapUseProtocol>> *)queryWithSqlStr:(NSString *)sql class:(Class<SJDBMapUseProtocol>)cls;
3941
- (nullable NSArray<id<SJDBMapUseProtocol>> *)queryAllDataWithClass:(Class<SJDBMapUseProtocol>)cls;
4042
- (nullable id<SJDBMapUseProtocol>)queryDataWithClass:(Class)cls primaryValue:(NSInteger)primaryValue;
4143
- (NSArray<id<SJDBMapUseProtocol>> * __nullable)queryDataWithClass:(Class)cls queryDict:(NSDictionary *)dict;

SJDBMap/DatabaseMapping/SJDatabaseMap+RealTime.m

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,26 @@ - (BOOL)insertOrUpdateDataWithModels:(NSArray<id<SJDBMapUseProtocol>> *)models {
8282

8383
- (BOOL)update:(id<SJDBMapUseProtocol>)model properties:(NSArray<NSString *> *)properties {
8484
if ( !model ) return NO;
85+
return [self updates:@[model] properties:properties];
86+
}
87+
88+
- (BOOL)updates:(NSArray<id<SJDBMapUseProtocol>> *)models properties:(NSArray<NSString *> *)properties {
89+
if ( models.count == 0 ) return NO;
90+
if ( properties.count == 0 ) return NO;
8591
NSMutableArray<SJDatabaseMapTableCarrier *> *container = [NSMutableArray array];
86-
SJDatabaseMapTableCarrier *carrier = [[SJDatabaseMapTableCarrier alloc] initWithClass:[model class]];
92+
SJDatabaseMapTableCarrier *carrier = [[SJDatabaseMapTableCarrier alloc] initWithClass:[[models firstObject] class]];
8793
[carrier parseCorrespondingKeysAddToContainer:container];
88-
__block BOOL result = NO;
94+
SJDatabaseMapCache *cache = [SJDatabaseMapCache new];
95+
__block BOOL result = YES;
8996
sj_transaction(self.database, ^{
90-
result = sj_value_update(self.database, model, properties, container, [SJDatabaseMapCache new]);
97+
[models enumerateObjectsUsingBlock:^(id<SJDBMapUseProtocol> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
98+
if ( sj_value_update(self.database, obj, properties, container, cache) ) return ;
99+
result = NO;
100+
*stop = YES;
101+
}];
91102
});
92103
return result;
93104
}
94-
95105
#pragma mark -
96106

97107
- (BOOL)deleteDataWithClass:(Class)cls primaryValues:(NSArray<NSNumber *> *)primaryValues {
@@ -130,6 +140,10 @@ - (BOOL)deleteDataWithClass:(Class)cls {
130140
}
131141

132142
#pragma mark -
143+
- (nullable NSArray<id<SJDBMapUseProtocol>> *)queryWithSqlStr:(NSString *)sql class:(Class<SJDBMapUseProtocol>)cls {
144+
return sj_value_query(self.database, sql.UTF8String, cls, nil, nil);
145+
}
146+
133147
- (nullable NSArray<id<SJDBMapUseProtocol>> *)queryAllDataWithClass:(Class<SJDBMapUseProtocol>)cls {
134148
if ( !cls ) return nil;
135149
NSString *sql_str = [NSString stringWithFormat:@"SELECT *FROM %s;", sj_table_name(cls)];

SJDBMap/DatabaseMapping/SJDatabaseMap.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,13 @@ NS_ASSUME_NONNULL_BEGIN
6767
*
6868
* property:@[@"name", @"age"] // 需要更新的属性
6969
*/
70-
- (void)update:(id<SJDBMapUseProtocol>)model properties:(NSArray<NSString *> *)properties callBlock:(void (^ __nullable)(BOOL result))block;
70+
- (void)update:(id<SJDBMapUseProtocol>)model
71+
properties:(NSArray<NSString *> *)properties
72+
callBlock:(void (^ __nullable)(BOOL result))block;
73+
74+
- (void)updates:(NSArray<id<SJDBMapUseProtocol>> *)models
75+
properties:(NSArray<NSString *> *)properties
76+
callBlock:(void (^ __nullable)(BOOL result))block;
7177
@end
7278

7379

@@ -114,6 +120,8 @@ NS_ASSUME_NONNULL_BEGIN
114120

115121
@interface SJDatabaseMap (Query)
116122

123+
- (void)queryWithSqlStr:(NSString *)sql class:(Class<SJDBMapUseProtocol>)cls completeCallBlock:(void(^)(NSArray<id<SJDBMapUseProtocol>> *__nullable data))block;
124+
117125
/*!
118126
* 查所有记录
119127
* 返回和这个类有关的所有数据

SJDBMap/DatabaseMapping/SJDatabaseMap.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ - (void)update:(id<SJDBMapUseProtocol>)model properties:(NSArray<NSString *> *)p
122122
}];
123123
}
124124

125+
- (void)updates:(NSArray<id<SJDBMapUseProtocol>> *)models properties:(NSArray<NSString *> *)properties callBlock:(void (^ __nullable)(BOOL result))block {
126+
__block BOOL result = NO;
127+
[self performTasksWithSubThreadTask:^(SJDatabaseMap * _Nonnull mapper) {
128+
result = [mapper updates:models properties:properties];
129+
} mainTreadTask:^(SJDatabaseMap * _Nonnull mapper) {
130+
if ( block ) block(result);
131+
}];
132+
}
125133
@end
126134

127135
// MARK: Delete
@@ -167,6 +175,15 @@ - (void)deleteDataWithClass:(Class)cls callBlock:(void (^ __nullable)(BOOL r))bl
167175

168176
@implementation SJDatabaseMap (Query)
169177

178+
- (void)queryWithSqlStr:(NSString *)sql class:(Class<SJDBMapUseProtocol>)cls completeCallBlock:(void(^)(NSArray<id<SJDBMapUseProtocol>> *__nullable data))block {
179+
__block NSArray<id<SJDBMapUseProtocol>> *models = nil;
180+
[self performTasksWithSubThreadTask:^(SJDatabaseMap * _Nonnull mapper) {
181+
models = [mapper queryWithSqlStr:sql class:cls];
182+
} mainTreadTask:^(SJDatabaseMap * _Nonnull mapper) {
183+
if ( block ) block(models);
184+
}];
185+
}
186+
170187
- (void)queryAllDataWithClass:(Class<SJDBMapUseProtocol>)cls completeCallBlock:(void(^ __nullable)(NSArray<id<SJDBMapUseProtocol>> * _Nullable data))block {
171188
__block NSArray<id<SJDBMapUseProtocol>> *models = nil;
172189
[self performTasksWithSubThreadTask:^(SJDatabaseMap * _Nonnull mapper) {

0 commit comments

Comments
 (0)