// // PTTableListViewController.m // PTDatabaseReader // // Created by Peng Tao on 15/11/23. // Copyright © 2015年 Peng Tao. All rights reserved. // #import "FLEXTableListViewController.h" #import "FLEXDatabaseManager.h" #import "FLEXSQLiteDatabaseManager.h" #import "FLEXRealmDatabaseManager.h" #import "FLEXTableContentViewController.h" #import "NSArray+Functional.h" @interface FLEXTableListViewController () @property (nonatomic, readonly) id dbm; @property (nonatomic, readonly) NSString *path; @property (nonatomic) NSArray *tables; @property (nonatomic) NSArray *filteredTables; + (NSArray *)supportedSQLiteExtensions; + (NSArray *)supportedRealmExtensions; @end @implementation FLEXTableListViewController - (instancetype)initWithPath:(NSString *)path { self = [super initWithStyle:UITableViewStyleGrouped]; if (self) { _path = [path copy]; _dbm = [self databaseManagerForFileAtPath:self.path]; [self.dbm open]; [self getAllTables]; } return self; } - (id)databaseManagerForFileAtPath:(NSString *)path { NSString *pathExtension = path.pathExtension.lowercaseString; NSArray *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions]; if ([sqliteExtensions indexOfObject:pathExtension] != NSNotFound) { return [FLEXSQLiteDatabaseManager managerForDatabase:path]; } NSArray *realmExtensions = [FLEXTableListViewController supportedRealmExtensions]; if (realmExtensions != nil && [realmExtensions indexOfObject:pathExtension] != NSNotFound) { return [FLEXRealmDatabaseManager managerForDatabase:path]; } return nil; } - (void)getAllTables { self.tables = self.filteredTables = [self.dbm queryAllTables];; } - (void)viewDidLoad { [super viewDidLoad]; self.showsSearchBar = YES; } #pragma mark - Search bar - (void)updateSearchResults:(NSString *)searchText { if (searchText.length) { self.filteredTables = [self.tables flex_filtered:^BOOL(NSString *tableName, NSUInteger idx) { return [tableName containsString:searchText]; }]; } else { self.filteredTables = self.tables; } [self.tableView reloadData]; } #pragma mark - Table View Data Source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.filteredTables.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FLEXTableListViewControllerCell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FLEXTableListViewControllerCell"]; } cell.textLabel.text = self.filteredTables[indexPath.row]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { FLEXTableContentViewController *contentViewController = [FLEXTableContentViewController new]; contentViewController.rows = [self.dbm queryAllDataWithTableName:self.filteredTables[indexPath.row]]; contentViewController.columns = [self.dbm queryAllColumnsWithTableName:self.filteredTables[indexPath.row]]; contentViewController.title = self.filteredTables[indexPath.row]; [self.navigationController pushViewController:contentViewController animated:YES]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [NSString stringWithFormat:@"Tables (%lu)", (unsigned long)self.filteredTables.count]; } #pragma mark - FLEXTableListViewController + (BOOL)supportsExtension:(NSString *)extension { extension = extension.lowercaseString; NSArray *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions]; if (sqliteExtensions.count > 0 && [sqliteExtensions indexOfObject:extension] != NSNotFound) { return YES; } NSArray *realmExtensions = [FLEXTableListViewController supportedRealmExtensions]; if (realmExtensions.count > 0 && [realmExtensions indexOfObject:extension] != NSNotFound) { return YES; } return NO; } + (NSArray *)supportedSQLiteExtensions { return @[@"db", @"sqlite", @"sqlite3"]; } + (NSArray *)supportedRealmExtensions { if (NSClassFromString(@"RLMRealm") == nil) { return nil; } return @[@"realm"]; } @end