@josuelmm/capacitor-background-geolocation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE.md +32 -0
  4. package/Package.swift +45 -0
  5. package/README.md +402 -0
  6. package/android/build.gradle +79 -0
  7. package/android/proguard-rules.pro +1 -0
  8. package/android/src/main/AndroidManifest.xml +83 -0
  9. package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
  20. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
  21. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
  22. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
  23. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
  24. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
  25. package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
  26. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  27. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
  28. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  29. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
  30. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  31. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
  32. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  40. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  41. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
  42. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  43. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
  44. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  45. package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
  46. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
  47. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  48. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
  49. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
  50. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
  51. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
  52. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
  53. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
  54. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
  55. package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
  56. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  57. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  58. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  59. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  60. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  61. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  62. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  63. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  64. package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
  65. package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
  66. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
  67. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
  68. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
  69. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  70. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  71. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  72. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
  73. package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
  74. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  75. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
  76. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  77. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  78. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  79. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
  80. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  81. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  82. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  83. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
  84. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  85. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
  86. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  87. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
  88. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  89. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  90. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  91. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  92. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  93. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  94. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  95. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  96. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  97. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  98. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  99. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  100. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  101. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  102. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  103. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  104. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  105. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  107. package/android/src/main/res/values/strings.xml +15 -0
  108. package/android/src/main/res/xml/authenticator.xml +7 -0
  109. package/android/src/main/res/xml/syncadapter.xml +9 -0
  110. package/dist/esm/definitions.d.ts +1052 -0
  111. package/dist/esm/definitions.js +142 -0
  112. package/dist/esm/definitions.js.map +1 -0
  113. package/dist/esm/index.d.ts +8 -0
  114. package/dist/esm/index.js +23 -0
  115. package/dist/esm/index.js.map +1 -0
  116. package/dist/esm/web.d.ts +92 -0
  117. package/dist/esm/web.js +242 -0
  118. package/dist/esm/web.js.map +1 -0
  119. package/dist/plugin.cjs.js +415 -0
  120. package/dist/plugin.cjs.js.map +1 -0
  121. package/dist/plugin.js +418 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
  124. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
  125. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
  126. package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
  127. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  128. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  129. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  130. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  131. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  132. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  133. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  134. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  135. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  136. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  137. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  138. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  139. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  140. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  141. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  143. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  144. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  145. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  146. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  147. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  148. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
  149. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
  150. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
  151. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
  152. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
  153. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  154. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  155. package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
  156. package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
  157. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
  158. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
  159. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  160. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
  161. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  162. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
  163. package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
  164. package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
  165. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
  166. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
  167. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  168. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
  169. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  170. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  171. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  172. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
  173. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
  174. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  175. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  176. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
  177. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  178. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
  179. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  180. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  181. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
  182. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
  183. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  184. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  185. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
  186. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
  187. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
  188. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
  189. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
  190. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
  191. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  192. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  193. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
  194. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
  195. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  197. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  198. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  199. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  200. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  201. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  202. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  203. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  204. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  205. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  206. package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
  207. package/package.json +82 -0
@@ -0,0 +1,520 @@
1
+ //
2
+ // MAURSQLiteLocationDAO.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 10/06/16.
6
+ //
7
+
8
+ #import <sqlite3.h>
9
+ #import <CoreLocation/CoreLocation.h>
10
+ #import "MAURSQLiteHelper.h"
11
+ #import "MAURGeolocationOpenHelper.h"
12
+ #import "MAURSQLiteLocationDAO.h"
13
+ #import "MAURLocationContract.h"
14
+
15
+ @implementation MAURSQLiteLocationDAO {
16
+ FMDatabaseQueue* queue;
17
+ MAURGeolocationOpenHelper *helper;
18
+ }
19
+
20
+ #pragma mark Singleton Methods
21
+
22
+ + (instancetype) sharedInstance
23
+ {
24
+ static MAURSQLiteLocationDAO *instance = nil;
25
+ static dispatch_once_t onceToken;
26
+ dispatch_once(&onceToken, ^{
27
+ instance = [[self alloc] init];
28
+ });
29
+
30
+ return instance;
31
+ }
32
+
33
+ - (id) init {
34
+ if (self = [super init]) {
35
+ helper = [[MAURGeolocationOpenHelper alloc] init];
36
+ queue = [helper getWritableDatabase];
37
+ }
38
+ return self;
39
+ }
40
+
41
+ - (NSArray<MAURLocation*>*) getValidLocations
42
+ {
43
+ __block NSMutableArray* locations = [[NSMutableArray alloc] init];
44
+
45
+ NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
46
+
47
+ [queue inDatabase:^(FMDatabase *database) {
48
+ FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
49
+ while([rs next]) {
50
+ MAURLocation *location = [self convertToLocation:rs];
51
+ [locations addObject:location];
52
+ }
53
+ // TODO
54
+ // NSLog(@"Retrieving locations failed code: %d: message: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
55
+
56
+ [rs close];
57
+ }];
58
+
59
+ return locations;
60
+ }
61
+
62
+ - (NSArray<MAURLocation*>*) getAllLocations
63
+ {
64
+ __block NSMutableArray* locations = [[NSMutableArray alloc] init];
65
+
66
+ NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
67
+
68
+ [queue inDatabase:^(FMDatabase *database) {
69
+ FMResultSet *rs = [database executeQuery:sql];
70
+ while([rs next]) {
71
+ MAURLocation *location = [self convertToLocation:rs];
72
+ [locations addObject:location];
73
+ }
74
+ // TODO
75
+ // NSLog(@"Retrieving locations failed code: %d: message: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
76
+
77
+ [rs close];
78
+ }];
79
+
80
+ return locations;
81
+ }
82
+
83
+ - (NSArray<MAURLocation*>*) getLocationsForSync
84
+ {
85
+ __block NSMutableArray* locations = [[NSMutableArray alloc] init];
86
+
87
+ [queue inTransaction:^(FMDatabase *database, BOOL *rollback) {
88
+ NSString *sql = [[self getLocationSelectString] stringByAppendingString: @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? ORDER BY " @LC_COLUMN_NAME_RECORDED_AT];
89
+
90
+ FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
91
+ while([rs next]) {
92
+ MAURLocation *location = [self convertToLocation:rs];
93
+ [locations addObject:location];
94
+ }
95
+ [rs close];
96
+
97
+ // v4.5.1 FIX (CRITICAL): mark the rows we just selected as SyncPending — NOT Deleted.
98
+ // The previous code UPDATEd the WHOLE table to Deleted before the upload had even started,
99
+ // losing every fix on HTTP failure / network drop. Now:
100
+ // PostPending → SyncPending (in-flight, do not re-include)
101
+ // on success in the network task: SyncPending → Deleted (deleteSyncedLocationsBefore:)
102
+ // on failure in the network task: SyncPending → PostPending (restoreFailedSyncLocations)
103
+ NSString *upd = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
104
+ if (![database executeUpdate:upd,
105
+ [NSString stringWithFormat:@"%ld", MAURLocationSyncPending],
106
+ [NSString stringWithFormat:@"%ld", MAURLocationPostPending]]) {
107
+ NSLog(@"Marking PostPending → SyncPending failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
108
+ }
109
+ }];
110
+
111
+ return locations;
112
+
113
+ }
114
+
115
+ - (NSNumber*) getLocationsForSyncCount
116
+ {
117
+ __block NSNumber* rowCount = nil;
118
+
119
+ [queue inTransaction:^(FMDatabase *database, BOOL *rollback) {
120
+ NSString *sql = @"SELECT COUNT(*) FROM " @LC_TABLE_NAME @" WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
121
+
122
+ FMResultSet *rs = [database executeQuery:sql, [NSString stringWithFormat:@"%ld", MAURLocationPostPending]];
123
+ if ([rs next]) {
124
+ rowCount = [NSNumber numberWithInt:[rs intForColumnIndex:0]];
125
+ }
126
+ [rs close];
127
+ }];
128
+
129
+ return rowCount;
130
+ }
131
+
132
+ - (NSNumber*) persistLocation:(MAURLocation*)location intoDatabase:(FMDatabase*)database
133
+ {
134
+ NSNumber* locationId = nil;
135
+ NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
136
+ NSNumber *recordedAt = [NSNumber numberWithDouble:timestamp];
137
+
138
+ NSString *sql = @"INSERT INTO " @LC_TABLE_NAME @" ("
139
+ @LC_COLUMN_NAME_TIME
140
+ @COMMA_SEP @LC_COLUMN_NAME_ACCURACY
141
+ @COMMA_SEP @LC_COLUMN_NAME_SPEED
142
+ @COMMA_SEP @LC_COLUMN_NAME_BEARING
143
+ @COMMA_SEP @LC_COLUMN_NAME_ALTITUDE
144
+ @COMMA_SEP @LC_COLUMN_NAME_LATITUDE
145
+ @COMMA_SEP @LC_COLUMN_NAME_LONGITUDE
146
+ @COMMA_SEP @LC_COLUMN_NAME_PROVIDER
147
+ @COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER
148
+ @COMMA_SEP @LC_COLUMN_NAME_STATUS
149
+ @COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT
150
+ @COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON
151
+ @COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL
152
+ @COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING
153
+ @") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
154
+
155
+ // v4.5: serialize driving events array to JSON for SQLite storage.
156
+ NSString *eventsJson = nil;
157
+ if (location.drivingEvents != nil && [location.drivingEvents count] > 0) {
158
+ NSError *jerr = nil;
159
+ NSData *jd = [NSJSONSerialization dataWithJSONObject:location.drivingEvents options:0 error:&jerr];
160
+ if (jd != nil) eventsJson = [[NSString alloc] initWithData:jd encoding:NSUTF8StringEncoding];
161
+ }
162
+
163
+ BOOL success = [database executeUpdate:sql,
164
+ [NSNumber numberWithDouble:[location.time timeIntervalSince1970]],
165
+ location.accuracy,
166
+ location.speed,
167
+ location.heading,
168
+ location.altitude,
169
+ location.latitude,
170
+ location.longitude,
171
+ location.provider ?: [NSNull null],
172
+ location.locationProvider ?: [NSNull null],
173
+ location.isValid == YES ? @(1) : @(0),
174
+ recordedAt,
175
+ eventsJson ?: [NSNull null],
176
+ location.batteryLevel ?: [NSNull null],
177
+ location.isCharging ?: [NSNull null]
178
+ ];
179
+
180
+ if (success) {
181
+ locationId = [NSNumber numberWithLongLong:[database lastInsertRowId]];
182
+ } else {
183
+ NSLog(@"Inserting location %@ failed code: %d: message: %@", location.time, [database lastErrorCode], [database lastErrorMessage]);
184
+ }
185
+
186
+ return locationId;
187
+ }
188
+
189
+ - (NSNumber*) persistLocation:(MAURLocation*)location
190
+ {
191
+ __block NSNumber* locationId = nil;
192
+
193
+ [queue inDatabase:^(FMDatabase *database) {
194
+ locationId = [self persistLocation:location intoDatabase:database];
195
+ }];
196
+
197
+ return locationId;
198
+ }
199
+
200
+ - (NSNumber*) persistLocation:(MAURLocation*)location limitRows:(NSInteger)maxRows
201
+ {
202
+ __block NSNumber *locationId;
203
+ NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
204
+ NSNumber *recordedAt = [NSNumber numberWithDouble:timestamp];
205
+
206
+ [queue inDatabase:^(FMDatabase *database) {
207
+ NSInteger rowCount = 0;
208
+ NSString *sql = @"SELECT COUNT(*) FROM " @LC_TABLE_NAME;
209
+
210
+ FMResultSet *rs = [database executeQuery:sql];
211
+ if ([rs next]) {
212
+ rowCount = [rs intForColumnIndex:0];
213
+ }
214
+ [rs close];
215
+
216
+ if (rowCount < maxRows) {
217
+ locationId = [self persistLocation:location intoDatabase:database];
218
+ return;
219
+ } else if (rowCount > maxRows) {
220
+ sql = [NSString stringWithFormat:@"DELETE FROM %1$@ WHERE %2$@ IN (SELECT %2$@ FROM %1$@ ORDER BY %3$@ LIMIT %4$ld);VACUUM;",
221
+ @LC_TABLE_NAME, @LC_COLUMN_NAME_ID, @LC_COLUMN_NAME_RECORDED_AT, (rowCount - maxRows)];
222
+ if (![database executeStatements:sql]) {
223
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
224
+ }
225
+ }
226
+
227
+ // get oldest location id to be overwritten
228
+ sql = @"SELECT MIN(" @LC_COLUMN_NAME_ID ") FROM " @LC_TABLE_NAME @" WHERE " @LC_COLUMN_NAME_RECORDED_AT
229
+ @" = (SELECT min(" @LC_COLUMN_NAME_RECORDED_AT @") FROM " @LC_TABLE_NAME @" )";
230
+ rs = [database executeQuery:sql];
231
+ if ([rs next]) {
232
+ locationId = [NSNumber numberWithLongLong:[rs longLongIntForColumnIndex:0]];
233
+ }
234
+ [rs close];
235
+
236
+ sql = @"UPDATE " @LC_TABLE_NAME @" SET "
237
+ @LC_COLUMN_NAME_TIME @EQ_BIND
238
+ @COMMA_SEP @LC_COLUMN_NAME_ACCURACY @EQ_BIND
239
+ @COMMA_SEP @LC_COLUMN_NAME_SPEED @EQ_BIND
240
+ @COMMA_SEP @LC_COLUMN_NAME_BEARING @EQ_BIND
241
+ @COMMA_SEP @LC_COLUMN_NAME_ALTITUDE @EQ_BIND
242
+ @COMMA_SEP @LC_COLUMN_NAME_LATITUDE @EQ_BIND
243
+ @COMMA_SEP @LC_COLUMN_NAME_LONGITUDE @EQ_BIND
244
+ @COMMA_SEP @LC_COLUMN_NAME_PROVIDER @EQ_BIND
245
+ @COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER @EQ_BIND
246
+ @COMMA_SEP @LC_COLUMN_NAME_STATUS @EQ_BIND
247
+ @COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT @EQ_BIND
248
+ @COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON @EQ_BIND
249
+ @COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL @EQ_BIND
250
+ @COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING @EQ_BIND
251
+ @" WHERE " @LC_COLUMN_NAME_ID @EQ_BIND;
252
+
253
+ // v4.5.1: serialize events for UPDATE path so old values don't bleed onto new locations
254
+ NSString *eventsJsonForUpdate = nil;
255
+ if (location.drivingEvents != nil && [location.drivingEvents count] > 0) {
256
+ NSError *jerr = nil;
257
+ NSData *jd = [NSJSONSerialization dataWithJSONObject:location.drivingEvents options:0 error:&jerr];
258
+ if (jd != nil) eventsJsonForUpdate = [[NSString alloc] initWithData:jd encoding:NSUTF8StringEncoding];
259
+ }
260
+
261
+ BOOL success = [database executeUpdate:sql,
262
+ [NSNumber numberWithDouble:[location.time timeIntervalSince1970]],
263
+ location.accuracy,
264
+ location.speed,
265
+ location.heading,
266
+ location.altitude,
267
+ location.latitude,
268
+ location.longitude,
269
+ location.provider ?: [NSNull null],
270
+ location.locationProvider ?: [NSNull null],
271
+ location.isValid == YES ? @(1) : @(0),
272
+ recordedAt,
273
+ eventsJsonForUpdate ?: [NSNull null],
274
+ location.batteryLevel ?: [NSNull null],
275
+ location.isCharging ?: [NSNull null],
276
+ locationId
277
+ ];
278
+
279
+ if (!success) {
280
+ NSLog(@"Inserting location %@ failed code: %d: message: %@", location.time, [database lastErrorCode], [database lastErrorMessage]);
281
+ locationId = [NSNumber numberWithInt:-1];
282
+ }
283
+
284
+ }];
285
+
286
+ return locationId;
287
+ }
288
+
289
+ - (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError
290
+ {
291
+ __block BOOL success;
292
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_ID @" = ?";
293
+
294
+ [queue inDatabase:^(FMDatabase *database) {
295
+ if ([database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted], locationId]) {
296
+ success = YES;
297
+ } else {
298
+ int errorCode = [database lastErrorCode];
299
+ NSString *errorMessage = [database lastErrorMessage];
300
+ NSLog(@"Delete location %@ failed code: %d: message: %@", locationId, errorCode, errorMessage);
301
+
302
+ if (outError != NULL) {
303
+ NSDictionary *errorDictionary = @{
304
+ NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil)
305
+ };
306
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:errorDictionary];
307
+ }
308
+
309
+ success = NO;
310
+ }
311
+ }];
312
+
313
+ return success;
314
+ }
315
+
316
+ - (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError
317
+ {
318
+ __block BOOL success;
319
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ?";
320
+
321
+ [queue inDatabase:^(FMDatabase *database) {
322
+ if ([database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted]]) {
323
+ success = YES;
324
+ } else {
325
+ int errorCode = [database lastErrorCode];
326
+ NSString *errorMessage = [database lastErrorMessage];
327
+ NSLog(@"Deleting all locations failed code: %d: message: %@", errorCode, errorMessage);
328
+
329
+ if (outError != NULL) {
330
+ NSDictionary *errorDictionary = @{
331
+ NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil)
332
+ };
333
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:errorDictionary];
334
+ }
335
+
336
+ success = NO;
337
+ }
338
+ }];
339
+
340
+ return success;
341
+ }
342
+
343
+ - (BOOL) deleteSyncedLocationsBefore:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError
344
+ {
345
+ __block BOOL success = YES;
346
+ // v4.5.1 — operate on SyncPending (the rows the network task is/was uploading), not on
347
+ // PostPending (those are still queued for real-time POST and must NOT be touched).
348
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME
349
+ @" SET " @LC_COLUMN_NAME_STATUS @" = ? "
350
+ @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? AND " @LC_COLUMN_NAME_RECORDED_AT @" <= ?";
351
+ [queue inDatabase:^(FMDatabase *database) {
352
+ if (![database executeUpdate:sql,
353
+ @(MAURLocationDeleted),
354
+ @(MAURLocationSyncPending),
355
+ @(cutoff)]) {
356
+ int errorCode = [database lastErrorCode];
357
+ NSString *errorMessage = [database lastErrorMessage];
358
+ NSLog(@"deleteSyncedLocationsBefore failed code: %d: message: %@", errorCode, errorMessage);
359
+ if (outError != NULL) {
360
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
361
+ }
362
+ success = NO;
363
+ }
364
+ }];
365
+ return success;
366
+ }
367
+
368
+ - (BOOL) restoreStaleSyncLocationsOlderThan:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError
369
+ {
370
+ // v4.5.1 — rows left as SyncPending because the previous sync's task was killed
371
+ // (app suspended mid-upload, OS process death, manual kill) never reach their
372
+ // success/failure callback. Call at the start of each sync window to rescue them.
373
+ __block BOOL success = YES;
374
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME
375
+ @" SET " @LC_COLUMN_NAME_STATUS @" = ? "
376
+ @" WHERE " @LC_COLUMN_NAME_STATUS @" = ? AND " @LC_COLUMN_NAME_RECORDED_AT @" < ?";
377
+ [queue inDatabase:^(FMDatabase *database) {
378
+ if (![database executeUpdate:sql,
379
+ @(MAURLocationPostPending),
380
+ @(MAURLocationSyncPending),
381
+ @(cutoff)]) {
382
+ int errorCode = [database lastErrorCode];
383
+ NSString *errorMessage = [database lastErrorMessage];
384
+ NSLog(@"restoreStaleSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
385
+ if (outError != NULL) {
386
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
387
+ }
388
+ success = NO;
389
+ }
390
+ }];
391
+ return success;
392
+ }
393
+
394
+ - (BOOL) restoreFailedSyncLocations:(NSError * __autoreleasing *)outError
395
+ {
396
+ // v4.5.1 — undo the in-flight transition: SyncPending → PostPending so the next sync window
397
+ // (or real-time post) re-tries them.
398
+ __block BOOL success = YES;
399
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
400
+ [queue inDatabase:^(FMDatabase *database) {
401
+ if (![database executeUpdate:sql, @(MAURLocationPostPending), @(MAURLocationSyncPending)]) {
402
+ int errorCode = [database lastErrorCode];
403
+ NSString *errorMessage = [database lastErrorMessage];
404
+ NSLog(@"restoreFailedSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
405
+ if (outError != NULL) {
406
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
407
+ }
408
+ success = NO;
409
+ }
410
+ }];
411
+ return success;
412
+ }
413
+
414
+ - (BOOL) deletePendingSyncLocations:(NSError * __autoreleasing *)outError
415
+ {
416
+ __block BOOL success = YES;
417
+ NSString *sql = @"UPDATE " @LC_TABLE_NAME @" SET " @LC_COLUMN_NAME_STATUS @" = ? WHERE " @LC_COLUMN_NAME_STATUS @" = ?";
418
+
419
+ [queue inDatabase:^(FMDatabase *database) {
420
+ if (![database executeUpdate:sql, [NSString stringWithFormat:@"%ld", MAURLocationDeleted], [NSString stringWithFormat:@"%ld", MAURLocationPostPending]]) {
421
+ int errorCode = [database lastErrorCode];
422
+ NSString *errorMessage = [database lastErrorMessage];
423
+ NSLog(@"deletePendingSyncLocations failed code: %d: message: %@", errorCode, errorMessage);
424
+ if (outError != NULL) {
425
+ *outError = [NSError errorWithDomain:Domain code:errorCode userInfo:@{ NSLocalizedDescriptionKey: errorMessage ?: @"" }];
426
+ }
427
+ success = NO;
428
+ }
429
+ }];
430
+
431
+ return success;
432
+ }
433
+
434
+ - (BOOL) clearDatabase
435
+ {
436
+ __block BOOL success;
437
+
438
+ [queue inDatabase:^(FMDatabase *database) {
439
+ NSString *sql = [NSString stringWithFormat: @"DROP TABLE %@", @LC_TABLE_NAME];
440
+ if (![database executeStatements:sql]) {
441
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
442
+ }
443
+ sql = [MAURLocationContract createTableSQL];
444
+ if (![database executeStatements:sql]) {
445
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
446
+ success = NO;
447
+ } else {
448
+ success = YES;
449
+ }
450
+ }];
451
+
452
+ return success;
453
+ }
454
+
455
+ - (NSString*) getDatabaseName
456
+ {
457
+ return [helper getDatabaseName];
458
+ }
459
+
460
+ - (NSString*) getDatabasePath
461
+ {
462
+ return [helper getDatabasePath];
463
+ }
464
+
465
+ - (NSString*) getLocationSelectString {
466
+ return @"SELECT " @LC_COLUMN_NAME_ID
467
+ @COMMA_SEP @LC_COLUMN_NAME_TIME
468
+ @COMMA_SEP @LC_COLUMN_NAME_ACCURACY
469
+ @COMMA_SEP @LC_COLUMN_NAME_SPEED
470
+ @COMMA_SEP @LC_COLUMN_NAME_BEARING
471
+ @COMMA_SEP @LC_COLUMN_NAME_ALTITUDE
472
+ @COMMA_SEP @LC_COLUMN_NAME_LATITUDE
473
+ @COMMA_SEP @LC_COLUMN_NAME_LONGITUDE
474
+ @COMMA_SEP @LC_COLUMN_NAME_PROVIDER
475
+ @COMMA_SEP @LC_COLUMN_NAME_LOCATION_PROVIDER
476
+ @COMMA_SEP @LC_COLUMN_NAME_STATUS
477
+ @COMMA_SEP @LC_COLUMN_NAME_RECORDED_AT
478
+ @COMMA_SEP @LC_COLUMN_NAME_EVENTS_JSON
479
+ @COMMA_SEP @LC_COLUMN_NAME_BATTERY_LEVEL
480
+ @COMMA_SEP @LC_COLUMN_NAME_IS_CHARGING
481
+ @" FROM " @LC_TABLE_NAME;
482
+ }
483
+
484
+ - (MAURLocation*) convertToLocation:(FMResultSet*)rs {
485
+ MAURLocation *location = [[MAURLocation alloc] init];
486
+ location.locationId = [NSNumber numberWithLongLong:[rs longLongIntForColumnIndex:0]];
487
+ NSTimeInterval timestamp = [rs doubleForColumnIndex:1];
488
+ location.time = [NSDate dateWithTimeIntervalSince1970:timestamp];
489
+ location.accuracy = [NSNumber numberWithDouble:[rs doubleForColumnIndex:2]];
490
+ location.speed = [NSNumber numberWithDouble:[rs doubleForColumnIndex:3]];
491
+ location.heading = [NSNumber numberWithDouble:[rs doubleForColumnIndex:4]];
492
+ location.altitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:5]];
493
+ location.latitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:6]];
494
+ location.longitude = [NSNumber numberWithDouble:[rs doubleForColumnIndex:7]];
495
+ location.provider = [rs stringForColumnIndex:8];
496
+ location.locationProvider = [NSNumber numberWithInt:[rs intForColumnIndex:9]];
497
+ location.isValid = [rs intForColumnIndex:10] == 1 ? YES : NO;
498
+ NSTimeInterval recordedAt = [rs longForColumnIndex:11];
499
+ location.recordedAt = [NSDate dateWithTimeIntervalSince1970:recordedAt];
500
+ // v4.5: events / battery / charging
501
+ NSString *eventsJson = [rs stringForColumnIndex:12];
502
+ if (eventsJson != nil && eventsJson.length > 0) {
503
+ NSError *jerr = nil;
504
+ id parsed = [NSJSONSerialization JSONObjectWithData:[eventsJson dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&jerr];
505
+ if ([parsed isKindOfClass:[NSMutableArray class]]) location.drivingEvents = parsed;
506
+ else if ([parsed isKindOfClass:[NSArray class]]) location.drivingEvents = [parsed mutableCopy];
507
+ }
508
+ if (![rs columnIndexIsNull:13]) location.batteryLevel = @([rs intForColumnIndex:13]);
509
+ if (![rs columnIndexIsNull:14]) location.isCharging = @([rs intForColumnIndex:14] == 1);
510
+ return location;
511
+ }
512
+
513
+ - (void) dealloc {
514
+ [helper close];
515
+ [queue close];
516
+ helper = nil;
517
+ queue = nil;
518
+ }
519
+
520
+ @end
@@ -0,0 +1,32 @@
1
+ //
2
+ // MAURSQLiteOpenHelper.h
3
+ // version: 1.0.0
4
+ //
5
+ // A helper class to manage database creation and version management.
6
+ // heavily inspired by Android implementation
7
+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/database/sqlite/SQLiteOpenHelper.java
8
+ //
9
+ // Note: Not for direct use, but as subclass instead (abstract class in java terminology)
10
+ //
11
+ // Created by Marian Hello on 22/06/16.
12
+ //
13
+
14
+ #ifndef MAURSQLiteOpenHelper_h
15
+ #define MAURSQLiteOpenHelper_h
16
+
17
+ #import <Foundation/Foundation.h>
18
+ #import "FMDB.h"
19
+
20
+ @interface MAURSQLiteOpenHelper : NSObject
21
+
22
+ - (instancetype)init:(NSString*)name version:(NSInteger)version;
23
+ - (NSDictionary*) getDatabaseMetadata;
24
+ - (NSString*) getDatabaseName;
25
+ - (NSString*) getDatabasePath;
26
+ - (FMDatabaseQueue*) getReadableDatabase;
27
+ - (FMDatabaseQueue*) getWritableDatabase;
28
+ - (void) close;
29
+
30
+ @end
31
+
32
+ #endif /* MAURSQLiteOpenHelper_h */