首页 > 数据库 >无涯教程-OC - SQLite

无涯教程-OC - SQLite

时间:2023-10-03 20:01:31浏览次数:56  
标签:DBManager SQLite return nil text OC 无涯 NSString sqlite3

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

步骤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

参考链接

https://www.learnfk.com/ios/ios-sqlite-database.html

标签:DBManager,SQLite,return,nil,text,OC,无涯,NSString,sqlite3
From: https://blog.51cto.com/u_14033984/7694444

相关文章

  • SQLite学习笔记——AND、OR运算符和UPDATE、DELETE语句
    运算符AND运算符带有WHERE字句的AND运算符语法如下SELECTcolumn1,column2,...columnNFROMtable_nameWHERE[condtion1]AND[condition2]...AND[conditionN];当满足AND连接的所有条件时,对应的列才会被选出来OR运算符带有WHERE子句的OR运算符语法如......
  • 什么是 Accessibility 领域的 Bypass Blocks
    Accessibility领域的BypassBlocks是指通过一种或多种方式绕过或规避Web或移动应用程序中的可访问性障碍,以使信息、功能或内容对于所有用户,包括那些具有不同能力或使用不同辅助技术的人,都能够无障碍地访问和使用。这些障碍可能包括视觉、听觉、认知或运动方面的障碍。BypassBlock......
  • 无涯教程-OC - 位置操作
    只要用户允许应用程序在核心位置框架的帮助下访问信息,无涯教程就可以在iOS中轻松找到用户的当前位置。位置处理步骤步骤1-创建一个基于View的简单应用程序。步骤2-选择您的项目文件,然后选择目标,然后添加CoreLocation.framework,如下所示-步骤3-在ViewController.xib中......
  • socket,tcp,http三者之间的区别和原理
    socket,tcp,http三者之间的区别和原理http、TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置:7   应用层   例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP6   表示层   例如XDR、ASN.1......
  • IoC容器
    前言IoC容器是Spring框架的核心组成部分之一。它是一个负责对象创建、组装和管理的容器,通过控制对象的创建和依赖关系的注入,实现了对象之间的解耦和灵活性。在传统的编程模型中,对象的创建和控制权通常由开发者负责,开发者需要手动实例化对象、处理对象之间的依赖关系并进行组装,这......
  • 网络编程之Socket
    在之前的文章《网络编程杂谈之TCP协议》中,我们阐述了TCP协议的基本概念,TCP作为一种可靠的、面向连接的数据传输协议,确保了数据在发送和接收之间的可靠性、顺序性和完整性,特点可以概括如下:1、面向连接:在进行数据传输之前,TCP需要客户端和服务器之间建立一个连接,这个连接包括一系列......
  • 解决ERROR oslo_messaging.rpc.server UnixHTTPConnectionPool(host=‘localhost‘, p
    zun.common.exception.ZunException:Unexpectederror:UnixHTTPConnectionPool(host=‘localhost’,port=None):Readtimedout.(readtimeout=60)2023-09-1317:26:08.6498468ERRORoslo_messaging.rpc.server[req-6ff62c08-fd25-4df6-8a81-d144956cbbd97db25ffff6314......
  • docker 安装
    通过阿里云的DockerCE镜像源站进行安装.1.使用官方安装脚本自动安装(仅适用于公网环境):curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun2.手动安装帮助(阿里云ECS可以通过内网安装,见注释部分内容):2.1Ubuntu14.04/16.04(使用apt-get进行安装):#step1......
  • 无涯教程-OC - 相机管理
    相机是移动设备中的常见功能之一。无涯教程可以用相机拍照并在无涯教程的应用程序中使用它,这也非常简单。相机管理步骤步骤1-创建一个简单的基于视图的应用程序。步骤2-在ViewController.xib中添加按钮并为该按钮创建IBAction。步骤3-添加图像视图并创建IBOutlet,将其......
  • 无涯教程-OC - 加速传感器
    Accelerometer计用于检测设备在三个方向x,y和z上的位置变化,无涯教程可以知道设备相对于地面的当前位置,为了测试该示例,您需要在设备上运行它,并且不能在模拟器上运行。示例的步骤第1步 - 创建一个简单的基于视图的应用程序。第2步 -在ViewController.xib中添加三个标签,......