无涯教程-OC - SQLite

60 阅读3分钟

SQLite可以在iOS中用于处理数据。它使用sqlite查询,这对于那些了解SQL的人来说更加容易。

涉及步骤

步骤1 - 创建一个简单的基于视图的应用程序。

步骤2 - 选择您的项目文件,然后选择目标,然后在选择框架中添加 libsqlite3.dylib 库。

步骤3 - 选择"File"→"New"→"File...",然后选择"Objective C class" ,然后单击"Next"。

步骤4 - 将类命名为 DBManager ,将" sub class of"作为NSObject。

步骤5 - 选择创建。

步骤6 - 如下更新 DBManager.h -

#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

步骤7 - 如下更新 DBManager.m -

#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)";

     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sqlite3_exec</span><span class="pun">(</span><span class="pln">database</span><span class="pun"></span><span class="pln"> sql_stmt</span><span class="pun"></span><span class="pln"> NULL</span><span class="pun"></span><span class="pln"> NULL</span><span class="pun"></span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">errMsg</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> SQLITE_OK</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        isSuccess </span><span class="pun">=</span><span class="pln"> NO</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"Failed to create table"</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
     sqlite3_close</span><span class="pun">(</span><span class="pln">database</span><span class="pun">);</span><span class="pln">
     </span><span class="kwd">return</span><span class="pln">  isSuccess</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     isSuccess </span><span class="pun">=</span><span class="pln"> NO</span><span class="pun">;</span><span class="pln">
     </span><span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"Failed to open/create database"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

}
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);

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sqlite3_step</span><span class="pun">(</span><span class="pln">statement</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> SQLITE_DONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">return</span><span class="pln"> YES</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">return</span><span class="pln"> NO</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  sqlite3_reset</span><span class="pun">(</span><span class="pln">statement</span><span class="pun">);</span><span class="pln">

} 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];

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sqlite3_prepare_v2</span><span class="pun">(</span><span class="pln">database</span><span class="pun"></span><span class="pln"> query_stmt</span><span class="pun"></span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun"></span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">statement</span><span class="pun"></span><span class="pln"> NULL</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> SQLITE_OK</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sqlite3_step</span><span class="pun">(</span><span class="pln">statement</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> SQLITE_ROW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="typ">NSString</span><span class="pln"> alloc</span><span class="pun">]</span><span class="pln"> initWithUTF8String</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*)</span><span class="pln"> sqlite3_column_text</span><span class="pun">(</span><span class="pln">statement</span><span class="pun"></span><span class="pln"> </span><span class="lit">0</span><span class="pun">)];</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">resultArray addObject</span><span class="pun">:</span><span class="pln">name</span><span class="pun">];</span><span class="pln">
        
        </span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln">department </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="typ">NSString</span><span class="pln"> alloc</span><span class="pun">]</span><span class="pln"> initWithUTF8String</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*)</span><span class="pln"> sqlite3_column_text</span><span class="pun">(</span><span class="pln">statement</span><span class="pun"></span><span class="pln"> </span><span class="lit">1</span><span class="pun">)];</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">resultArray addObject</span><span class="pun">:</span><span class="pln">department</span><span class="pun">];</span><span class="pln">
        
        </span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln">year </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="typ">NSString</span><span class="pln"> alloc</span><span class="pun">]</span><span class="pln">initWithUTF8String</span><span class="pun">:</span><span class="pln">
        </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*)</span><span class="pln"> sqlite3_column_text</span><span class="pun">(</span><span class="pln">statement</span><span class="pun"></span><span class="pln"> </span><span class="lit">2</span><span class="pun">)];</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">resultArray addObject</span><span class="pun">:</span><span class="pln">year</span><span class="pun">];</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> resultArray</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"Not found"</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
     sqlite3_reset</span><span class="pun">(</span><span class="pln">statement</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} return nil; }

步骤8 - 如下更新 ViewController.xib 文件-

iOS Tutorial

步骤9 - 为上述文本字段创建IBOutlet。

步骤10 - 为上述按钮创建IBAction。

步骤11 - 如下更新 ViewController.h -

#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

步骤12 - 如下更新 ViewController.m -

#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

运行应用程序时,无涯教程将获得以下输出,无涯教程可以在其中添加并找到学生详细信息-

iOS Tutorial

参考链接

www.learnfk.com/ios/ios-sql…