mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-11-01 13:23:37 -04:00
166 lines
5.2 KiB
Objective-C
166 lines
5.2 KiB
Objective-C
//
|
|
// 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"
|
|
#import "FLEXMacros.h"
|
|
|
|
@interface FLEXTableListViewController ()
|
|
@property (nonatomic, readonly) id<FLEXDatabaseManager> dbm;
|
|
@property (nonatomic, readonly) NSString *path;
|
|
|
|
@property (nonatomic, readonly) FLEXMutableListSection<NSString *> *tables;
|
|
|
|
+ (NSArray<NSString *> *)supportedSQLiteExtensions;
|
|
+ (NSArray<NSString *> *)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<FLEXTableViewSection *> *)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];
|
|
NSArray *rowIDs = nil;
|
|
if ([host.dbm respondsToSelector:@selector(queryRowIDsInTable:)]) {
|
|
rowIDs = [host.dbm queryRowIDsInTable:tableName];
|
|
}
|
|
UIViewController *resultsScreen = [FLEXTableContentViewController
|
|
columns:columns rows:rows rowIDs:rowIDs tableName:tableName database:host.dbm
|
|
];
|
|
[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<NSString *> *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<FLEXDatabaseManager>)databaseManagerForFileAtPath:(NSString *)path {
|
|
NSString *pathExtension = path.pathExtension.lowercaseString;
|
|
|
|
NSArray<NSString *> *sqliteExtensions = FLEXTableListViewController.supportedSQLiteExtensions;
|
|
if ([sqliteExtensions indexOfObject:pathExtension] != NSNotFound) {
|
|
return [FLEXSQLiteDatabaseManager managerForDatabase:path];
|
|
}
|
|
|
|
NSArray<NSString *> *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<NSString *> *sqliteExtensions = FLEXTableListViewController.supportedSQLiteExtensions;
|
|
if (sqliteExtensions.count > 0 && [sqliteExtensions indexOfObject:extension] != NSNotFound) {
|
|
return YES;
|
|
}
|
|
|
|
NSArray<NSString *> *realmExtensions = FLEXTableListViewController.supportedRealmExtensions;
|
|
if (realmExtensions.count > 0 && [realmExtensions indexOfObject:extension] != NSNotFound) {
|
|
return YES;
|
|
}
|
|
|
|
return NO;
|
|
}
|
|
|
|
+ (NSArray<NSString *> *)supportedSQLiteExtensions {
|
|
return @[@"db", @"sqlite", @"sqlite3"];
|
|
}
|
|
|
|
+ (NSArray<NSString *> *)supportedRealmExtensions {
|
|
if (NSClassFromString(@"RLMRealm") == nil) {
|
|
return nil;
|
|
}
|
|
|
|
return @[@"realm"];
|
|
}
|
|
|
|
@end
|