sqlite can be used in ios for handling data. it uses sqlite queries, which makes it easier for those who know sql.
steps involved
step 1 − create a simple view based application.
step 2 − select your project file, then select targets and then add libsqlite3.dylib library in choose frameworks.
step 3 − create a new file by selecting file→ new → file... → select objective c class and click next.
step 4 − name the class as dbmanager with "sub class of" as nsobject.
step 5 − select create.
step 6 − update dbmanager.h as follows −
#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
step 7 − update dbmanager.m as follows −
#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;
}
step 8 − update viewcontroller.xib file as follows −
step 9 − create iboutlets for the above text fields.
step 10 − create ibaction for the above buttons.
step 11 − update viewcontroller.h as follows −
#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
step 12 − update viewcontroller.m as follows −
#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
output
when we run the application, we'll get the following output where we can add and find the student details −