用代码的方式在Xcode中引入数据库,创建学生类加入数据库
代码程序如下:
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
#import "AppDelegate.h"
#import "MainViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)dealloc
{
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
[_window release];
MainViewController *main = [[MainViewController alloc]init];
self.window.rootViewController = main;
[main release];
/*创建 : creat table 表名(列名,类型 primary key(组件的意思 指表内容不能重复))
增加 : insert into 表名 values (,)按创建表里列的顺序写
删除 : delete from 表名 where ( 条件 name = ...)
修改 : update 表名 set(新值)where
update student set name = 'wang' where id = 22 where id = 22
查询 : select * from 表名
select *from student where id = 24
*/
return YES;
}
#import <UIKit/UIKit.h>
@interface MainViewController : UIViewController
@end
#import "MainViewController.h"
#import "DBHandler.h"
//@class Student
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
DBHandler *db = [DBHandler shareInstance];
[db openDB];
//单例对象不能被release
//调用创建表
[db createTable];
// 创建数据
Student *stu = [[Student alloc]init];
stu.name = @"zahngyang";
stu.number = 22;
[db insertStudent:stu];
[stu release];
NSLog(@"%@",[db selectAll]);
}
#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface DBHandler : NSObject
//成员变量
{
//数据库指针,直接操作本地的数据库文件
sqlite3 *_dbPoint;
}
//单例方法
//引入系统库
+ (DBHandler *)shareInstance;
//打开数据库
- (BOOL)openDB;
//关闭数据库
- (BOOL)closeDB;
//创建表
- (BOOL)createTable;
//增加一条数据
- (BOOL) insertStudent:(Student *)stu;
////删除
//- (BOOL) deleteStudent:(Student *)stu;
////修改
//- (BOOL)updataWithNewStu:(Student *)stu whereNumber:(NSInteger )number;
//查询
- (NSArray *)selectAll;
@end
#import "DBHandler.h"
#import "Student.h"
@implementation DBHandler
+ (DBHandler *)shareInstance
{
//单例方法的实现
// 1. 每一次运行第一次调用这个方法,会创建对象
static DBHandler *dbhandler = nil;//声明一个空的静态指针
if (dbhandler == nil) {
dbhandler = [[DBHandler alloc]init];
}
// 2. 如果指针不为空 直接返回
return dbhandler;
}
//实现
- (BOOL)openDB
{
//先找数据库文件路径
//取它的文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];//取出来是数组
//给数据库拼接文件名便于找到
NSString *dbPath = [docPath stringByAppendingPathComponent:@"qianqian.db"];
NSLog(@"数据库文件路径:%@",dbPath);
//参数1 : 数据库文件路径[dbPath UTF8String]转换NSString转换成char*
//参数2 : (指针指向路径 如果没有文件就创建一个) 数据库指针的地址
//作用 : 按照路径,如果路径下有文件,就给dbPoint赋值;如果没有文件,就创建一个文件给dbPoint赋值
int result = sqlite3_open([dbPath UTF8String], &_dbPoint);//char * 字符串指针
// //宏
// SQLITE_OK 作用是找错
NSLog(@"结果: %d",result);
// if (result == SQLITE_OK) {
// NSLog(@"打开数据库成功");
// return YES;
//
// }else{
// NSLog(@"打开数据库失败,错误代码: %d",result);
// return NO;
// }
//封装之后可以这么用
[self judgeResult:result operation:@"打开数据库"];
return YES;
}
- (BOOL)closeDB
{
int result = sqlite3_close(_dbPoint);
// NSLog(@"结果: %d",result);
// if (result == SQLITE_OK) {
// NSLog(@"打开数据库成功");
// return YES;
//
// }else{
// NSLog(@"打开数据库失败,错误代码: %d",result);
// return NO;
// }
// return YES;
return [self judgeResult:result operation:@"关闭数据库"];
}
//封装一个结果判断的方法 两个参数一个是结果 另一个是参数
- (BOOL)judgeResult:(int)result operation : (NSString *)name
{
if (result == SQLITE_OK) {
NSLog(@"%@成功",name);
return YES;
}else{
NSLog(@"%@失败,错误代码: %d",name,result);
return NO;
}
}
- (BOOL)createTable
{
//1.创建一个sql语句
NSString *sqlStr = [NSString stringWithFormat:@"create table student (name text,number integer primary key)"];
//2.执行sql语句
// 1.输出指针执行对象 2.执行的语句 3. 函数指针 回调用
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], NULL, NULL, NULL);
return [self judgeResult:result operation:@"创建表"];
}
- (BOOL)insertStudent:(Student *)stu
{
NSString *sqlStr = [NSString stringWithFormat:@"insert into student values ('%@',%ld)",stu.name,stu.number];
int result = sqlite3_exec(_dbPoint, [sqlStr UTF8String], NULL, NULL, NULL);
return[self judgeResult:result operation:@"增加一条数据"];
}
- (NSArray *)selectAll
{
NSString *sqlStr = @"select * from student";
//参数1 : 数据库指针
//参数2 : sql语句
//参数3 : 限制sql语句的长度,-1就是不限
//参数4 : 数据库状态监视
//作为一个临时的数据库,保存sql语句执行的结果,在结束时集中同步到数据库文件中.
sqlite3_stmt *stmt = nil;
//作用 : 执行sql语句,将结果保存到stmt中
int result = sqlite3_prepare_v2(_dbPoint, [sqlStr UTF8String], -1, &stmt, NULL);
//提取结果
//先创建一个可变数组,准备保存结果
NSMutableArray *stuArr = [NSMutableArray array];
if (result == SQLITE_OK) {
//成功就提取数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
//数据处理按列处理,按列提取
//参数1:
//参数2 :第几列
const unsigned char *nameStr = sqlite3_column_text(stmt, 0);
NSString *name = [NSString stringWithUTF8String:nameStr];
NSInteger number = sqlite3_column_int(stmt, 1);
// 创建一个student对象
Student *stu = [[Student alloc]init];
stu.name = name;
stu.number = number;
// 将对象添加到数组
[stuArr addObject:stu];
[stu release];
}
}
//同步到本地数据库后把指针销毁掉
sqlite3_finalize(stmt);
return stuArr;
}
@end
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger number;
@end
#import "Student.h"
@implementation Student
- (void)dealloc
{
[_name release];
[super dealloc];
}
@end