iOS SQLite Database
Introduction
Using SQLite to handle data in iOS. If you already understand SQL, you can easily master SQLite database operations.
Steps for the Example
- Create a simple View-based application.
- Select the project file, then select the target, and add the
libsqlite3.dyliblibrary to the Linked Frameworks and Libraries. - Create a new file by selecting File β New β Fileβ¦, then choose Objective-C class, and click Next.
- Set Subclass of to
NSObject, and name the classDBManager. - Click Create.
- Update
DBManager.h, as shown below:
#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
- Update
DBManager.m, as shown below:
#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];
;
}
return sharedInstance;
}
- (BOOL)createDB
{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths;
// Build the path to the database file
databasePath = [ initWithString: [docsDir stringByAppendingPathComponent: @"student.db"]];
BOOL isSuccess = YES;
NSFileManager *filemgr = ;
if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
const char *dbpath = ;
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 = ;
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values ("%d","%@", "%@", "%@")",, name, department, year];
const char *insert_stmt = ;
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 = ;
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"select name, department, year from studentsDetail where regno="%@"",registerNumber];
const char *query_stmt = ;
NSMutableArray *resultArray = [init];
if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ROW)
{
NSString *name = [ initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)];
[resultArray addObject:name];
NSString *department = [ initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];
[resultArray addObject:department];
NSString *year = [initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)];
[resultArray addObject:year];
return resultArray;
}
else
{
NSLog(@"Not found");
return nil;
}
sqlite3_reset(statement);
}
}
return nil;
}
- Update
ViewController.xibas shown in the figure below:
- Create
IBOutletsfor the text fields shown above. - Create
IBActionsfor the buttons shown above. - Update
ViewController.h, as shown below:
#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
- Update
ViewController.m, as shown below:
#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
{
;
// Do any additional setup after loading the view from its nib.
}
- (void)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 = [saveData: regNoTextField.text
name:nameTextField.text
department: departmentTextField.text
year:yearTextField.text];
}
else
{
alertString = @"Enter all fields";
}
if (success == NO)
{
UIAlertView *alert = [initWithTitle: alertString
message:nil
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
;
}
}
- (IBAction)findData:(id)sender
{
NSArray *data = [findByRegisterNumber: findByRegisterNumberTextField.text];
if (data == nil)
{
UIAlertView *alert = [initWithTitle: @"Data not found"
message:nil
delegate:nil
cancelButtonTitle: @"OK"
otherButtonTitles:nil];
;
regNoTextField.text = @"";
nameTextField.text = @"";
departmentTextField.text = @"";
yearTextField.text = @"";
}
else
{
reg
YouTip