You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.1 KiB

  1. //
  2. // PTTableListViewController.m
  3. // PTDatabaseReader
  4. //
  5. // Created by Peng Tao on 15/11/23.
  6. // Copyright © 2015Peng Tao. All rights reserved.
  7. //
  8. #import "FLEXTableListViewController.h"
  9. #import "FLEXDatabaseManager.h"
  10. #import "FLEXSQLiteDatabaseManager.h"
  11. #import "FLEXRealmDatabaseManager.h"
  12. #import "FLEXTableContentViewController.h"
  13. @interface FLEXTableListViewController ()
  14. {
  15. id<FLEXDatabaseManager> _dbm;
  16. NSString *_databasePath;
  17. }
  18. @property (nonatomic, strong) NSArray<NSString *> *tables;
  19. + (NSArray<NSString *> *)supportedSQLiteExtensions;
  20. + (NSArray<NSString *> *)supportedRealmExtensions;
  21. @end
  22. @implementation FLEXTableListViewController
  23. - (instancetype)initWithPath:(NSString *)path
  24. {
  25. self = [super initWithStyle:UITableViewStyleGrouped];
  26. if (self) {
  27. _databasePath = [path copy];
  28. _dbm = [self databaseManagerForFileAtPath:_databasePath];
  29. [_dbm open];
  30. [self getAllTables];
  31. }
  32. return self;
  33. }
  34. - (id<FLEXDatabaseManager>)databaseManagerForFileAtPath:(NSString *)path
  35. {
  36. NSString *pathExtension = path.pathExtension.lowercaseString;
  37. NSArray<NSString *> *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions];
  38. if ([sqliteExtensions indexOfObject:pathExtension] != NSNotFound) {
  39. return [[FLEXSQLiteDatabaseManager alloc] initWithPath:path];
  40. }
  41. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  42. if (realmExtensions != nil && [realmExtensions indexOfObject:pathExtension] != NSNotFound) {
  43. return [[FLEXRealmDatabaseManager alloc] initWithPath:path];
  44. }
  45. return nil;
  46. }
  47. - (void)getAllTables
  48. {
  49. NSArray<NSDictionary<NSString *, id> *> *resultArray = [_dbm queryAllTables];
  50. NSMutableArray<NSString *> *array = [NSMutableArray array];
  51. for (NSDictionary<NSString *, id> *dict in resultArray) {
  52. NSString *columnName = (NSString *)dict[@"name"] ?: @"";
  53. [array addObject:columnName];
  54. }
  55. self.tables = array;
  56. }
  57. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  58. {
  59. return self.tables.count;
  60. }
  61. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  62. {
  63. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FLEXTableListViewControllerCell"];
  64. if (!cell) {
  65. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
  66. reuseIdentifier:@"FLEXTableListViewControllerCell"];
  67. }
  68. cell.textLabel.text = self.tables[indexPath.row];
  69. return cell;
  70. }
  71. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  72. {
  73. FLEXTableContentViewController *contentViewController = [[FLEXTableContentViewController alloc] init];
  74. contentViewController.contentsArray = [_dbm queryAllDataWithTableName:self.tables[indexPath.row]];
  75. contentViewController.columnsArray = [_dbm queryAllColumnsWithTableName:self.tables[indexPath.row]];
  76. contentViewController.title = self.tables[indexPath.row];
  77. [self.navigationController pushViewController:contentViewController animated:YES];
  78. }
  79. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  80. {
  81. return [NSString stringWithFormat:@"%lu tables", (unsigned long)self.tables.count];
  82. }
  83. + (BOOL)supportsExtension:(NSString *)extension
  84. {
  85. extension = extension.lowercaseString;
  86. NSArray<NSString *> *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions];
  87. if (sqliteExtensions.count > 0 && [sqliteExtensions indexOfObject:extension] != NSNotFound) {
  88. return YES;
  89. }
  90. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  91. if (realmExtensions.count > 0 && [realmExtensions indexOfObject:extension] != NSNotFound) {
  92. return YES;
  93. }
  94. return NO;
  95. }
  96. + (NSArray<NSString *> *)supportedSQLiteExtensions
  97. {
  98. return @[@"db", @"sqlite", @"sqlite3"];
  99. }
  100. + (NSArray<NSString *> *)supportedRealmExtensions
  101. {
  102. if (NSClassFromString(@"RLMRealm") == nil) {
  103. return nil;
  104. }
  105. return @[@"realm"];
  106. }
  107. @end