// // 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 "FLEXMutableListSection.h" #import "NSArray+FLEX.h" #import "FLEXAlert.h" @interface FLEXTableListViewController () @property (nonatomic, readonly) id dbm; @property (nonatomic, readonly) NSString *path; @property (nonatomic, readonly) FLEXMutableListSection *tables; + (NSArray *)supportedSQLiteExtensions; + (NSArray *)supportedRealmExtensions; @end @implementation FLEXTableListViewController - (instancetype)initWithPath:(NSString *)path { self = [super initWithStyle:UITableViewStyleGrouped]; if (self) { _path = path.copy; _dbm = [self databaseManagerForFileAtPath:path]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.showsSearchBar = YES; // Compose query button // UIBarButtonItem *composeQuery = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(queryButtonPressed) ]; // Cannot run custom queries on realm databases composeQuery.enabled = [self.dbm respondsToSelector:@selector(executeStatement:) ]; [self addToolbarItems:@[composeQuery]]; } - (NSArray *)makeSections { _tables = [FLEXMutableListSection list:[self.dbm queryAllTables] cellConfiguration:^(__kindof UITableViewCell *cell, NSString *tableName, NSInteger row) { cell.textLabel.text = tableName; } filterMatcher:^BOOL(NSString *filterText, NSString *tableName) { return [tableName localizedCaseInsensitiveContainsString:filterText]; } ]; self.tables.selectionHandler = ^(FLEXTableListViewController *host, NSString *tableName) { NSArray *rows = [host.dbm queryAllDataInTable:tableName]; NSArray *columns = [host.dbm queryAllColumnsOfTable:tableName]; UIViewController *resultsScreen = [FLEXTableContentViewController columns:columns rows:rows]; resultsScreen.title = tableName; [host.navigationController pushViewController:resultsScreen animated:YES]; }; return @[self.tables]; } - (void)reloadData { self.tables.customTitle = [NSString stringWithFormat:@"Tables (%@)", @(self.tables.filteredList.count) ]; [super reloadData]; } - (void)queryButtonPressed { FLEXSQLiteDatabaseManager *database = self.dbm; [FLEXAlert makeAlert:^(FLEXAlert *make) { make.title(@"Execute an SQL query"); make.textField(nil); make.button(@"Run").handler(^(NSArray *strings) { FLEXSQLResult *result = [database executeStatement:strings[0]]; if (result.message) { [FLEXAlert showAlert:@"Message" message:result.message from:self]; } else { UIViewController *resultsScreen = [FLEXTableContentViewController columns:result.columns rows:result.rows ]; [self.navigationController pushViewController:resultsScreen animated:YES]; } }); make.button(@"Cancel").cancelStyle(); } showFrom: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; } #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