0

NSDictionary、NSArray、および NSString を使用して、この Am Struck で 2 つのテーブル データを別の画面に結合する方法 オブジェクトを NSDictionary に追加する方法は? 以下は私のDBClass.mです

    #import "DBClass.h"

@implementation DBClass

+(NSString *)connectdb
{
    NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dbFolder=[docDir objectAtIndex:0];
    NSFileManager *manager=[NSFileManager defaultManager];
    if (![manager fileExistsAtPath:dbFolder])
    {
        [manager createDirectoryAtPath:dbFolder withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSString *dbPath=[dbFolder stringByAppendingPathComponent:@"JoinsDB.sqlite"];
    if (![manager fileExistsAtPath:dbPath])
    {
        [manager copyItemAtPath:[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"JoinsDB.sqlite"] toPath:dbPath  error:nil];
    }
    NSLog(@"%@",dbPath);
    return dbPath;
}

+(BOOL)createTable
{
    NSString *dbpath=[DBClass connectdb];
    sqlite3 *dbObj;
    if (sqlite3_open([dbpath UTF8String], &dbObj)==SQLITE_OK)
    {
        sqlite3_stmt *stmt=nil;
        const char *sql="create table Company(ID INTEGER,Name VARCHAR,Age INTEGER,Address VARCHAR,Salary INTEGER)";
        sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil);
        if (sqlite3_step(stmt)==SQLITE_DONE)
        {
            NSLog(@"tabel created successfull");
        }
        else
        {
            NSLog(@"tabel already created");
        }
        sqlite3_finalize(stmt);
        sqlite3_close(dbObj);
    }
    return YES;
}

+(int)saveData:(NSMutableArray *)data
{
    sqlite3 *dbObj;
    sqlite3_stmt *stmt=nil;
    NSString *dbPath=[DBClass connectdb];
    const char *sql=[[NSString stringWithFormat:@"insert into Company(ID,Name,Age,Address,Salary) values(\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",[data objectAtIndex:0],[data objectAtIndex:1],[data objectAtIndex:2],[data objectAtIndex:3],[data objectAtIndex:4]]UTF8String];

    if (sqlite3_open([dbPath UTF8String], &dbObj)==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [[data objectAtIndex:0]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 2, [[data objectAtIndex:1]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 3, [[data objectAtIndex:2]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 4, [[data objectAtIndex:3]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 5, [[data objectAtIndex:4]UTF8String], -1, SQLITE_TRANSIENT);

        sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil);
        if (sqlite3_step(stmt)==SQLITE_DONE)
        {
            NSLog(@"data insertion stmnt executed properly");
        }
        else
            NSLog(@"data insertion stmnt not executed");

        sqlite3_finalize(stmt);
        sqlite3_close(dbObj);

    }
    return sqlite3_last_insert_rowid(dbObj);
}


+(BOOL)createTable2
{
    NSString *dbpath=[DBClass connectdb];
    sqlite3 *dbObj;
    if (sqlite3_open([dbpath UTF8String], &dbObj)==SQLITE_OK)
    {
        sqlite3_stmt *stmt=nil;
        const char *sql="create table Department(ID INTEGER,Dept VARCHAR,Emp_ID INTEGER)";
        sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil);
        if (sqlite3_step(stmt)==SQLITE_DONE)
        {
            NSLog(@"tabel created successfull");
        }
        else
        {
            NSLog(@"tabel already created");
        }
        sqlite3_finalize(stmt);
        sqlite3_close(dbObj);
    }
    return YES;
}

+(int)saveData2:(NSMutableArray *)data
{
    sqlite3 *dbObj;
    sqlite3_stmt *stmt=nil;
    NSString *dbPath=[DBClass connectdb];
    const char *sql=[[NSString stringWithFormat:@"insert into Department(ID,Dept,Emp_ID) values(\"%@\",\"%@\",\"%@\")",[data objectAtIndex:0],[data objectAtIndex:1],[data objectAtIndex:2]]UTF8String];

    if (sqlite3_open([dbPath UTF8String], &dbObj)==SQLITE_OK)
    {
        sqlite3_bind_text(stmt, 1, [[data objectAtIndex:0]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 2, [[data objectAtIndex:1]UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 3, [[data objectAtIndex:2]UTF8String], -1, SQLITE_TRANSIENT);


        sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil);
        if (sqlite3_step(stmt)==SQLITE_DONE)
        {
            NSLog(@"data insertion stmnt executed properly");
        }
        else
            NSLog(@"data insertion stmnt not executed");

        sqlite3_finalize(stmt);
        sqlite3_close(dbObj);

    }
    return sqlite3_last_insert_rowid(dbObj);
}

+(NSMutableArray *)getData
{
    sqlite3 *dbobj;
    NSString *dbpath  =[DBClass connectdb];
    NSMutableArray *readArray=[[NSMutableArray alloc]init];
    if(sqlite3_open([dbpath UTF8String], &dbobj)==SQLITE_OK)
    {
        sqlite3_stmt *statement=nil;

        //**** NSString *string=@"SELECT name FROM emptable";
        NSString *string=@"SELECT EMP_ID, Age, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID";

        const char *query=[string UTF8String];
        if(sqlite3_prepare_v2(dbobj, query, -1, &statement, NULL)==SQLITE_OK)
        {
            while (sqlite3_step(statement)==SQLITE_ROW)
            {
            NSMutableDictionary *readDic=[[NSMutableDictionary alloc] init];

        [readDic setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)] forKey:@"Emp_ID"];

        [readDic setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] forKey:@"Name"];
        [readDic setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] forKey:@"Dept"];

                [readArray addObject:readDic];
                NSLog(@"%@",readDic);
            }
        }
        sqlite3_finalize(statement);
    }
    NSLog(@"%@",readArray);
    sqlite3_close(dbobj);
    return readArray;   
}

@end

UITableview で表示する方法と Viewdidload で何ができるか これは私の JoinViewController.m

 #import "JoinViewController.h"
#import "DBClass.h"

@interface JoinViewController ()

@end

@implementation JoinViewController
@synthesize data,array;
@synthesize Table;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

   array=[[NSMutableArray alloc]init];
    data=[[NSMutableArray alloc]init];

    array=[DBClass getData];
    for( NSDictionary *obj in array)
    {
        NSLog(@"%@",obj);

        [data addObject:[obj objectForKey:@"Emp_ID"]];
        [data addObject:[obj objectForKey:@"Name"]];
        [data addObject:[obj objectForKey:@"Dept"]];
    }
    NSLog(@"\n%d",[data count]);
    [Table reloadData];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
   // Return the number of sections.
   return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    //return 1;
   return [data count];


}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = [[data objectAtIndex:indexPath.row]objectForKey:@"Emp_ID"];
    cell.textLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"Name"];
    cell.textLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"Dept"];

    return cell;
}


#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}


@end
4

1 に答える 1

0

getdata メソッドで、SQL は EMP_ID、Age、DEPT を要求していますが、データを Emp_ID、Name、Dept として保存しています。一方は年齢を言い、もう一方は名前を言います。また、列番号を複製し、列 2 から DEPT になる値を取得し、それを Emp_ID に格納し、列 1 から値を 2 回取得します。これは年齢になります。 Name と Dept にあります。列 0 は Emp_ID、1 は Age (おそらく Name に変更する必要があります)、2 は DEPT です。

以下を使用して、SQL ステートメントを少し単純化することもできます。

SELECT EMP_ID, Age, DEPT FROM COMPANY, DEPARTMENT where COMPANY.ID = DEPARTMENT.EMP_ID;
于 2013-07-12T13:40:10.927 に答える