2014年3月3日月曜日

お菓子管理アプリ

こんばんは、
そういえば昔お菓子を管理するアプリを作っていたので
すこし紹介しようと思います。

会社のデスクにおいて、お菓子のストックを管理し、
対象のお菓子の在庫をwebビューで表示するアプリです。
バーコード読み取り機能もなにげにあるアプリです。

コンビニで買ってきたお菓子をテキストに入力し、
登録を押すと、右のpikerveiwに追加します。








































PikerViewをスクロールした際、対象のお菓子をWebViewに表示する処理は
下記のように書きます。
データベースを生成したり、色々やってます。

- (void) pickerView: (UIPickerView*)pView didSelectRow:(NSInteger) row  inComponent:(NSInteger)component {
    NSLog(@"row=%d, component=%d", row, component);
    
    
    int row1 = [picker selectedRowInComponent:0];
   
    sqlite3* db;
    
    NSString* work_path;
    NSString* database_filename;
    
    NSString* database_path;
    NSString* template_path;
    
    NSString* okasiname;
    
    // データベース名をここでは “testDB.sqlite” とします。
    database_filename = @"new.sqlite";
    
    // データベースファイルを格納するために文書フォルダーを取得します。
    work_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
    // データベースファイルのパスを取得します。
    database_path = [NSString stringWithFormat:@"%@/%@", work_path, database_filename];
    
    // 文書フォルダーにデータベースファイルが存在しているかを確認します。
    NSFileManager* manager = [NSFileManager defaultManager];
    
    
    if (![manager fileExistsAtPath:database_path])
    {
        NSError* error = nil;
        
        // 文書フォルダーに存在しない場合は、データベースの複製元をバンドルから取得します。
        template_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_filename];
        
        // バンドルから取得したデータベースファイルを文書フォルダーにコピーします。
        if (![manager copyItemAtPath:template_path toPath:database_path error:&error])
        {
            // データベースファイルのコピーに失敗した場合の処理です。
            NSLog(@"DB読み込み失敗");
        } else {
            NSLog(@"DB読み込み成功");
        }
        
    }else {
        NSLog(@"DB発見");
    }
    // 文書フォルダーに用意されたデータベースファイルを開きます。
    if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK)
    {
        // データベースファイルを SQLite で開くことに成功しました。
        NSLog(@"DBopen成功");
    }
    
    sqlite3_stmt *statement;
    
    const char *sql = "select * from cate2;";
   
    
    if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK)
    {
        
        NSLog(@"error message ‘%s’.", sqlite3_errmsg(db));
        
    }else{
        
        NSLog(@"SQLコンパイル成功");
        //NSString *pliceStr2 = [ NSString stringWithFormat: @"%d", row ];
        
        //sqlite3_bind_text  (statement, 1, [pliceStr2 UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_step(statement);
        //管理画面のテキストに抽出データ格納
        
        //if (row == 0){okasiname = @"tomono2";}
        if (row1 == 0){okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];}
        else if (row1==1)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];}
        else if (row1==2) {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];}
        else if (row1==3)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];}
        else if (row1==4)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];}
        else if (row1==5)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];}
        else if (row1==6)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 7)];}
        else if (row1==7)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 8)];}
        else if (row1==8)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 9)];}
        else if (row1==9)  {okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 10)];}
        
        
        //prepare済みSQLステートメントを廃棄します。
        sqlite3_finalize(statement);
        
        //データベースを閉じます。
        sqlite3_close(db);
    }

    
    usertxt.text = okasiname;
    
    NSString *work_path2 = @"http://jan.bizwing.jp/?word=";
    NSString *work_path3 =[NSString stringWithFormat:@"%@%@",work_path2,okasiname];
    
    
    NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:work_path3 ]];
    [webView loadRequest:req];

    //int row2 = [picker selectedRowInComponent:1];
    //int row3 = [picker selectedRowInComponent:2];
    
    NSLog(@"selected , %d", row1);
   // NSLog(@"selected %d, %d, %d", row1, row2, row3);

}



登録ボタンの処理も載せておきます。

登録処理の中でデータベースを作り、アップデートしています。
なにげに色々書いてあるので役立つかもしれません。


- (IBAction)insertButton:(id) sender {

    // キーボードを隠す
    [self textFieldResignFirstResponder];
    
    sqlite3* db;
    
    NSString* work_path;
    NSString* database_filename;
    
    NSString* database_path;
    NSString* template_path;
    
    NSString* chk;
    
    chk=calText.text;
    
    if (chk == @""){
        UIAlertView *alert = [ [UIAlertView alloc] initWithTitle:@"未入力"
                                                         message:@"登録お菓子を入力してください"
                                                        delegate:self
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
        [alert show];
        
    }
    
    else{
    
    // データベース名をここでは “testDB.sqlite” とします。
    database_filename = @"new.sqlite";
    
    // データベースファイルを格納するために文書フォルダーを取得します。
    work_path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
    // データベースファイルのパスを取得します。
    database_path = [NSString stringWithFormat:@"%@/%@", work_path, database_filename];
    
    // 文書フォルダーにデータベースファイルが存在しているかを確認します。
    NSFileManager* manager = [NSFileManager defaultManager];
    
    
    if (![manager fileExistsAtPath:database_path])
    {
        NSError* error = nil;
        
        // 文書フォルダーに存在しない場合は、データベースの複製元をバンドルから取得します。
        template_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_filename];
        
        // バンドルから取得したデータベースファイルを文書フォルダーにコピーします。
        if (![manager copyItemAtPath:template_path toPath:database_path error:&error])
        {
            // データベースファイルのコピーに失敗した場合の処理です。
            NSLog(@"DB読み込み失敗");
        } else {
            NSLog(@"DB読み込み成功");
        }
        
    }else {
        NSLog(@"DB発見");
    }
    // 文書フォルダーに用意されたデータベースファイルを開きます。
    if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK)
    {
        // データベースファイルを SQLite で開くことに成功しました。
        NSLog(@"DBopen成功");
    }
    
    
    //******************************トランケート************************************
    sqlite3_exec(db, "BEGIN", NULL, NULL, NULL );
    //******************************トランケート************************************
    sqlite3_stmt *statement;
    
    //    const char *sql = "SELECT osaihu,bank,allmoney,warkmoney,overwarkH,overwarkM,moneyH,overwarkmoney,cledit,nextwarkmoney FROM osaihuDB WHERE osaihuid = 0;";
    const char *sql;
    
    if ([picker selectedRowInComponent:0] ==0) {sql = "update cate2 set name0 = ?;";}
    else if([picker selectedRowInComponent:0]==1){sql = "update cate2 set name1 = ?;";}
    else if([picker selectedRowInComponent:0]==2){sql= "update cate2 set name2 = ?;";}
    else if([picker selectedRowInComponent:0]==3){sql= "update cate2 set name3 = ?;";}
    else if([picker selectedRowInComponent:0]==4){sql = "update cate2 set name4 = ?;";}
    else if([picker selectedRowInComponent:0]==5){sql= "update cate2 set name5 = ?;";}
    else if([picker selectedRowInComponent:0]==6){sql = "update cate2 set name6 = ?;";}
    else if([picker selectedRowInComponent:0]==7){sql= "update cate2 set name7 = ?;";}
    else if([picker selectedRowInComponent:0]==8){sql = "update cate2 set name8 = ?;";}
    else if([picker selectedRowInComponent:0]==9){sql = "update cate2 set name9 = ?;";
}
    
    if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK)
    {
        
        NSLog(@"error message ‘%s’.", sqlite3_errmsg(db));
        
    }else{
        
        NSLog(@"SQLコンパイル成功");
        
        
        sqlite3_bind_text  (statement, 1, [calText.text UTF8String], -1, SQLITE_TRANSIENT);
        //sqlite3_bind_text  (statement, 1, [calText.text UTF8String], -1, SQLITE_TRANSIENT);
        
        sqlite3_step(statement);
        //管理画面のテキストに抽出データ格納
        //add
        
        //okasiname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
        
        sqlite3_exec(db, "COMMIT", NULL, NULL, NULL );
        
        //prepare済みSQLステートメントを廃棄します。
        sqlite3_finalize(statement);
        
        
        //データベースを閉じます。
        sqlite3_close(db);
        
        UIAlertView *alert = [ [UIAlertView alloc] initWithTitle:@"登録"
                                                         message:@"登録完了しました"
                                                        delegate:self
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
        [alert show];
        picker.delegate = self;


    }







0 件のコメント:

コメントを投稿