با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن، این جلسه قصد داریم تا در مورد پایگاه داده SQLite در iOS آموزش های لازم زا ارائه دهیم.SQLite یک سامانه مدیریت پایگاه داده متنباز و رابطهای است و سیستم ذخیره اطلاعات فایلی است که به زبان C و در قالب یک کتابخانه نوشته شده است. یکی از مهمترین ویژگیهای این پایگاه داده پشتیبانی بسیار گستردهای است که از آن میشود و تمام زبانهای برنامهنویسی مطرح جهان از این پایگاه داده پشتیبانی میکنند.
از SQLite می توان در iOS برای مدیریت به داده ها استفاده کرد.
همچنین در آن از کوئری های sqlite استفاده می شود، وبرای کسانی که از قبل با SQL آشنا هستند،کار را آسان تر می کند.
مراحل مربوطه پایگاه داده SQLite
مرحله ۱ : یک برنامه ساده را ایجاد کنید.
مرحله ۲ : پرونده پروژه خود را انتخاب کنید، سپس اهداف را انتخاب کنید و بعد در کادر انتخاب خود، کتابخانه libsqlite3.dylib را اضافه کنید.
مرحله ۳ : فایل جدیدی را با انتخاب File → New → File … → ایجاد کنید و کلاس Objective C را انتخاب کنید و بعد کلیک کنید.
مرحله ۴ : نام کلاس به عنوان DBManager با “زیر کلاس ” به عنوان NSObject نام گذاری کنید.
مرحله ۵ : سپس آن را انتخاب و ایجاد کنید.
مرحله ۶ : فایل DBManager.h را مانند کد زیر بروز رسانی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #import <Foundation/Foundation.h> #import <sqlite3.h> @interface DBManager : NSObject { NSString *databasePath; } +(DBManager*)getSharedInstance; -(BOOL)createDB; -(BOOL) saveData:(NSString*)registerNumber name:(NSString*)name department:(NSString*)department year:(NSString*)year; -(NSArray*) findByRegisterNumber:(NSString*)registerNumber; @end |
مرحله ۷ : سپس فایل DBManager.m را مانند کد زیر بروز رسانی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #import "DBManager.h" static DBManager *sharedInstance = nil; static sqlite3 *database = nil; static sqlite3_stmt *statement = nil; @implementation DBManager +(DBManager*)getSharedInstance { if (!sharedInstance) { sharedInstance = [[super allocWithZone:NULL]init]; [sharedInstance createDB]; } return sharedInstance; } -(BOOL)createDB { NSString *docsDir; NSArray *dirPaths; // Get the documents directory dirPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); docsDir = dirPaths[0]; // Build the path to the database file databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"student.db"]]; BOOL isSuccess = YES; NSFileManager *filemgr = [NSFileManager defaultManager]; if ([filemgr fileExistsAtPath: databasePath ] == NO) { const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { char *errMsg; const char *sql_stmt = "create table if not exists studentsDetail (regno integer primary key, name text, department text, year text)"; if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { isSuccess = NO; NSLog(@"Failed to create table"); } sqlite3_close(database); return isSuccess; } else { isSuccess = NO; NSLog(@"Failed to open/create database"); } } return isSuccess; } - (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name department:(NSString*)department year:(NSString*)year; { const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values (\"%d\",\"%@\", \"%@\", \"%@\")",[registerNumber integerValue], name, department, year]; const char *insert_stmt = [insertSQL UTF8String]; sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) { return YES; } else { return NO; } sqlite3_reset(statement); } return NO; } - (NSArray*) findByRegisterNumber:(NSString*)registerNumber { const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { NSString *querySQL = [NSString stringWithFormat: @"select name, department, year from studentsDetail where regno=\"%@\"",registerNumber]; const char *query_stmt = [querySQL UTF8String]; NSMutableArray *resultArray = [[NSMutableArray alloc]init]; if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { NSString *name = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)]; [resultArray addObject:name]; NSString *department = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)]; [resultArray addObject:department]; NSString *year = [[NSString alloc]initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)]; [resultArray addObject:year]; return resultArray; } else { NSLog(@"Not found"); return nil; } sqlite3_reset(statement); } } return nil; } |
مرحله ۸ : فایل ViewController.xib را مانند تصویر زیر بروز رسانی کنید :
مرحله ۹ : IBOutlets را برای فیلدهای متن بالا ایجاد کنید.
مرحله ۱۰ :سپس ایجاد IBAction برای دکمه های بالا.
مرحله ۱۱ : ViewController.h را به صورت زیر وارد نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #import <UIKit/UIKit.h> #import "DBManager.h" @interface ViewController : UIViewController<UITextFieldDelegate> { IBOutlet UITextField *regNoTextField; IBOutlet UITextField *nameTextField; IBOutlet UITextField *departmentTextField; IBOutlet UITextField *yearTextField; IBOutlet UITextField *findByRegisterNumberTextField; IBOutlet UIScrollView *myScrollView; } -(IBAction)saveData:(id)sender; -(IBAction)findData:(id)sender; @end |
مرحله ۱۲ : فایل ViewController.m را به شرح زیر به روز رسانی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *) nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)saveData:(id)sender { BOOL success = NO; NSString *alertString = @"Data Insertion failed"; if (regNoTextField.text.length>0 &&nameTextField.text.length>0 && departmentTextField.text.length>0 &&yearTextField.text.length>0 ) { success = [[DBManager getSharedInstance]saveData: regNoTextField.text name:nameTextField.text department: departmentTextField.text year:yearTextField.text]; } else { alertString = @"Enter all fields"; } if (success == NO) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle: alertString message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } -(IBAction)findData:(id)sender { NSArray *data = [[DBManager getSharedInstance]findByRegisterNumber: findByRegisterNumberTextField.text]; if (data == nil) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Data not found" message:nil delegate:nil cancelButtonTitle: @"OK" otherButtonTitles:nil]; [alert show]; regNoTextField.text = @""; nameTextField.text =@""; departmentTextField.text = @""; yearTextField.text =@""; } else { regNoTextField.text = findByRegisterNumberTextField.text; nameTextField.text =[data objectAtIndex:0]; departmentTextField.text = [data objectAtIndex:1]; yearTextField.text =[data objectAtIndex:2]; } } #pragma mark - Text field delegate -(void)textFieldDidBeginEditing:(UITextField *)textField { [myScrollView setFrame:CGRectMake(10, 50, 300, 200)]; [myScrollView setContentSize:CGSizeMake(300, 350)]; } -(void)textFieldDidEndEditing:(UITextField *)textField { [myScrollView setFrame:CGRectMake(10, 50, 300, 350)]; } -(BOOL) textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } @end |
هنگامی که ما برنامه را اجرا می کنیم، خروجی زیر را مشاهده می کنیم و همچنین می توانیم جزئیات دانش آموزان را اضافه و پیدا کنیم.
SQLite به دلیل استفاده از سیستم فایلی، نیازی به تنظیمات پیچیده و اساسی مانند بسیاری از DBMSهای دیگر ندارد.
کافی است فایل پایگاه داده را در کنار نرمافزار قرار دهید و از آن استفاده کنید.