比賽記分器-數據庫入門二

前言:前段時間請假去參加了一個聯通舉辦的乒乓球比賽,雖然沒有拿到第一名,可是我也不是最後一名(偷笑)。在比賽中看到裁判員仍是用原始的記錄方式-紙質來記錄分數(雖然不能所有替代紙質),感受是否是能用手機(這裏用手機表明,不是App,爲了方便使用後來我也開發了小程序版)來記分,實現基本的記分功能,因而它誕生了-比賽記分器。廢話很少說,先看下App的效果圖:

最終效果圖

設計目的:

用於乒乓球,羽毛球等比賽記分,並可查看比賽記錄sql

功能設計:

小回合記分 大比分記分 隨時查看比賽記錄 計時功能 一局比賽結束換位功能數據庫

實現功能:

小回合記分 大比分記分 記分時不息屏 隨時查看比賽記錄 搖一搖截屏 可選比賽爲普通比賽 標準比賽(標準比賽比普通比賽更嚴格,必須根據比賽規則結束比賽)小程序

細節:

隊名輸入 隨機先手 翻頁、分數上下區域點擊、按鈕均可增減比分 從新開始比賽 搖一搖截屏 記分時不息屏bash

待開發功能

計時功能 一局比賽結束換位功能佈局

具體功能實現:

1.頁面佈局:小比分使用UIPageViewController,能夠實現翻頁效果和自帶的點擊效果;使用Masonry和frame混合佈局 2.數據存儲:fmdb使用測試

主要詳細功能實現:

1.分數視圖封裝:包括上面的小比分,加減和重置按鈕,UIPageViewController的使用;ui

  • 1-1.初始化 底部添加一個背景視圖 RBScoreView類
CGFloat width = kSCREENW/2 - 2*KWidth(20);
    self.pageBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, width)];
    [self addSubview:self.pageBgView];
    
    self.pageVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:nil];
    self.pageVC.view.frame = self.pageBgView.bounds;
    // 設置當前顯示的控制器
    [self.pageVC setViewControllers:@[self.dataArray[0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    self.pageVC.delegate = self;
    self.pageVC.dataSource = self;
    [self.pageBgView addSubview:self.pageVC.view];
    [self.parentVC addChildViewController:self.pageVC];
複製代碼
  • 1-2.仿UITableView代理方法 自定義方法 經過索引獲取當前的控制器
- (RBPageChildrenVC *)viewControllerAtIndex:(NSUInteger)index {
    // Return the data view controller for the given index.
    if (([self.dataArray count] == 0) || (index >= [self.dataArray count])) {
        return nil;
    }
    
    RBPageChildrenVC *chiledVC = self.dataArray[index];
    
    return chiledVC;
}
複製代碼
  • 1-3.仿UITableView代理方法 自定義方法 經過當前的控制器獲取索引,number是自控制器的一個屬性
- (NSUInteger)indexOfViewController:(RBPageChildrenVC *)viewController {
    return viewController.number.integerValue;
}
複製代碼
  • 1-4.UIPageViewController代理方法
// 向前翻頁展現的ViewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    NSInteger index = [self indexOfViewController:(RBPageChildrenVC *)viewController];
    
    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }
    
    index--;
    self.currentIndex = index;
    return [self viewControllerAtIndex:index];
}

// 向後翻頁展現的ViewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    NSUInteger index = [self indexOfViewController:(RBPageChildrenVC *)viewController];
    if (index == NSNotFound) {
        return nil;
    }
    
    index++;
    self.currentIndex = index;
    if (index == [self.dataArray count]) {
        return nil;
    }
    return [self viewControllerAtIndex:index];
}
複製代碼
  • 1-5.初始化數據源
- (NSMutableArray *)leftArray {
    if (_leftArray == nil) {
        _leftArray = [NSMutableArray arrayWithCapacity:0];
        
        for (int i = 0; i <= MAX_COUNT; i++) {
            RBPageChildrenVC *childrenVC = [[RBPageChildrenVC alloc] init];
            childrenVC.isRed = YES;
            childrenVC.number = [NSString stringWithFormat:@"%d", i];
            [_leftArray addObject:childrenVC];
        }
    }
    
    return _leftArray;
}
複製代碼
  • 1-6.初始化視圖
self.leftScoreView = [[RBScoreView alloc] initWithFrame:CGRectMake(0, 0, width, width + KHeight(10+2*44)) parentVC:self dataArray:self.leftArray];
    self.leftScoreView.backgroundColor = RBRedColor;
    [self.leftBgView addSubview:self.leftScoreView];
//    self.leftScoreView.buttonClickAnimated = YES;

    [self.leftScoreView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.leftBgView).offset(0);
        make.size.mas_equalTo(CGSizeMake(width, width + KHeight(10+2*44)));
        make.top.equalTo(self.leftBgView.mas_centerY).offset(0);
    }];
複製代碼

到這裏首頁基本的視圖就OK了,其餘的都是很簡單控件的使用了。 編碼

首頁最終效果圖

2.比賽記錄數據存儲:fmdb數據庫封裝,小比分的存儲url

  • 2-1.SQLite數據庫 基本數據類型
數據類型 說明
NULL 空值
INTEGER 有符號整數,存儲在一、二、三、四、6或8個字節中
REAL 浮點數,存儲爲8字節的IEEE浮點數
TEXT 文本串,使用數據庫編碼(UTF-8, UTF-16BE或UTF-16LE)存儲
BLOB 大塊數據,image存儲
  • 2-2.建立表 注意關閉使用FMDatabase後 記得關閉
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Score.db"];
    NSLog(@"------path:%@", path);
    fmDatabase = [FMDatabase databaseWithPath:path];
    BOOL isOpen = [fmDatabase open];
    if (isOpen) {
        NSLog(@"數據庫打開成功!");
    } else {
        NSLog(@"數據庫打開失敗!");
    }
    
    NSString *sql = @"create table if not exists MyScore(id integer primary key autoincrement, date text, content text, redname text, bluename text, redscore integer, bluescore integer, gametype integer)";
    if ([fmDatabase executeUpdate:sql]) {
        NSLog(@"表建立成功!");
        [fmDatabase close];
    } else {
        NSLog(@"表建立失敗!");
    }
複製代碼
  • 2-3.插入數據 int或NSInteger類型插入時加@(int/NSInteger),注意插入的是對象
if ([fmDatabase executeUpdate:sql, score.date, score.content, score.redName, score.blueName, @(score.redScore), @(score.blueScore), @(score.blueScore), @(score.gameType)]) {
        NSLog(@"數據插入成功!");
        
        [fmDatabase close];
    } else {
        NSLog(@"數據插入失敗!");
        NSLog(@"error = %@", [fmDatabase lastErrorMessage]);
    }
複製代碼
  • 2-4 查詢比賽結果
BOOL isOpen = [fmDatabase open];
    if (isOpen) {
        NSLog(@"數據庫打開成功!");
    } else {
        NSLog(@"數據庫打開失敗!");
    }
    
    NSString *sql = @"select * from MyScore";
    FMResultSet *set = [fmDatabase executeQuery:sql];
    NSMutableArray *array = [[NSMutableArray alloc] init];
    
    while ([set next]) {
        RBScoreModel *scoreModel = [[RBScoreModel alloc] init];
        scoreModel.date = [set stringForColumn:@"date"];
        scoreModel.content = [set stringForColumn:@"content"];
        scoreModel.scoreId = [set intForColumn:@"id"];
        scoreModel.redName = [set stringForColumn:@"redname"];
        scoreModel.redScore = [set intForColumn:@"redscore"];
        scoreModel.blueName = [set stringForColumn:@"bluename"];
        scoreModel.blueScore = [set intForColumn:@"bluescore"];
        scoreModel.gameType = [set intForColumn:@"gametype"];

        [array addObject:scoreModel];
    }
    
    [fmDatabase close];
    return array;
複製代碼
  • 2-5.刪除表 刪除成功後從新建立table 防止新增字段
- (BOOL)deleteTable {
    NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Score.db"];
    NSFileManager *manager = [NSFileManager defaultManager];
    NSError *error = nil;
    if ([manager fileExistsAtPath:path]) {
        BOOL isRemove = [manager removeItemAtPath:path error:&error];
        if (isRemove) {
            // 刪除成功後從新建立table 防止測試時新增字段
            [self createTable];
            
            return YES;
        }
        else {
            NSLog(@"%@", error);
            
            return NO;
        }
    }
    else {
        return YES;
    }
}
複製代碼
  • 2-6.按鈕操做添加數據spa

    • 2-6-1.回合結束按鈕 構造數據
NSDictionary *littleScoreDic = @{@"redScore":@(self.leftScoreView.currentIndex), @"blueScore":@(self.rightScoreView.currentIndex), @"roundEndTime":[RBTool getCurrentDateWithFormat:@"yyyy-MM-dd HH:mm:ss"]};
    [self.littleArray addObject:littleScoreDic];
複製代碼
    • 2-6-2.比賽結束按鈕 添加數據
RBScoreModel *model = [[RBScoreModel alloc] init];
    model.date = [RBTool getCurrentDateWithFormat:@"yyyy-MM-dd HH:mm:ss"];
    model.redName = self.leftTeamView.nameText;
    model.redScore = self.leftBigScoreTF.text.length == 0?0:self.leftBigScoreTF.text.integerValue;
    model.blueName = self.rightTeamView.nameText;
    model.blueScore = self.rightBigScoreTF.text.length == 0?0:self.rightBigScoreTF.text.integerValue;
    model.gameType = self.gameType;
    NSString *content = [RBTool convertObjectToJson:self.littleArray];
    model.content = content;
    [[FMDBManager sharedDBManager] addScoreModel:model];
複製代碼

至此,文章就該結束了,可是我發現不少人不太會使用比賽記分器,因此文章末尾添加了比賽記分器的使用方法。

使用方法:

以乒乓球比賽爲例: 1.使用順序,選擇比賽類型,輸入比賽雙方的隊名,搖先手,看誰先發球,而後贏得一方加分數,本回合結束點擊按鈕回合結束,比賽結束點擊比賽結束。 2.「+」按鈕用於增長分數,「-」按鈕減小分數,「重置」按鈕用於重置分數。 3.小比分是大框的比分,表明一個回合的比分;大比分是小框的比分,表明一局比賽的比分。「回合結束」表示一回合(一局)比賽結束,小比分清空,小比分多的一隊大比分加1;「比賽結束」表示本局比賽結束,比賽比分所有重置。 4.比賽結束後默認跳轉到比賽結果列表,可查看比賽結果。

相關文章
相關標籤/搜索