iOS编程------SQLite / 数据库

来源:互联网 发布:qq群搜索排名优化 编辑:程序博客网 时间:2024/04/27 10:58
/*# Sqlite3## 创建数据库方法## 一、终端命令进入到 /Users/wushumin/Documents/Sqlite 文件夹下。    > cd Documents/Sqlite     创建 student数据库  > sqlite3 student.db     PS:sqlite3 终端常用命令    .help 查看帮助    .tables 查看数据库中所有的表    .schema 查看数据库中表的创建语句    .schema tablename 查看某个表的创建语句    .header on/off 打开或者关闭表头(是否显示字段)    .exit 或者 .quit 退出。### 通过sql语句对表进行操作#### 表相关操作**创建表**    > sqlite> CREATE TABLE userInfo (uid INTEGER PRIMARY KEY NOT NULL, username TEXT, pwd TEXT);***>CREATE TABLE "studentInfo" ("uid" INTEGER PRIMARY KEY NOT NULL AUTO , "username" TEXT, "pwd" TEXT );创建数据库表的语法格式:    CREATE TABLE `tableName` (    `ID` INTEGER PRIMERY KEY NOT NULL,  // 主键,因为在OC 中 id 与关键字 id 冲突,因此一般不建议使用 id 作为主键名。  INTEGER 整数类型。     )  *注意: sql 中语法大小写都可以识别。但是表名 和 字段名 严格区分大小写。 sql 语句必须 以 `;` 结尾,表示一条语句的结束。    *注意: 如果 在sqlite状态下,不输入`;` 分号,则认为该sql语句没有结束。此时输入分号,敲下回车即可。**删除表**> drop table userInfo;    #### 表内容相关操作**表插入数据**> sqlite> insert into "studentInfo" values(1,'wushumin','男',18);这里数据表名 加不加引号都可以. 也可以写成 insert into studentInfo    **表查询数据**> sqlite> select * from studentInfo;    > 1|wushumin|男|18`*`  表示查询所有数据。**表更新数据**> sqlite> update studentInfo set name = '吴书敏' where sid = 1;格式:     update `tablename` set `column` = `newValue` (where `aColumn` = `aValue`);     where 子句 用来设定判断条件。 把sid = 1 行的name值改为 吴书敏。    **表删除数据**    > sqlite> delete from studentInfo where sid = 1;如果不设置 where条件子句,会删除此表中的所有数据。    ################################################练习***##创建表sqlite> create table "studentInfo" ("uid" integer primary key not null , "username" text, "pwd" text);##表插入数据sqlite> insert into "studentInfo" values(10, 'wsm', '666');##查询所有数据sqlite> .header onsqlite> select * from studentInfo;##查询具体数据sqlite> select * from "studentInfo" where uid = 11;##更新数据sqlite> update "studentInfo" set username = '王腾飞' where uid = 11;#删除数据  如果不设置 where条件子句,会删除此表中的所有数据。sqlite> delete from "studentInfo" where uid = 11;*/////////////////////////////////////////////////////////////////////////  AppDelegate.h//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import <UIKit/UIKit.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@end////  AppDelegate.m//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.    //sqlite 在iOS 开发中的运用    //1.导入sqlite框架 libsqlite3    //2.导入头文件<sqlite3.h>    //3.数据库相关操作   //*****************************************************//    /* UI19 数据库     SQL语句     创建     修改     删除     表的操作     iOS 为移动开发,这决定了iOS的数据库要 即精巧而数据能力又不能太差。     SQLite 为嵌入式数据库。     1. 支持事件,不需要配置,不需要安装,不需要管理员。     2. 支持大部分sql (struct query language) 数据库查询语句     3. 可以跨平台使用,最大2t。     4. 系统精巧,占用容量小。     5. api 使用简单。     // sqlite 语法入门     1. 数据类型  和 存储特点     sqlite 采用的是动态数据类型。 划分为以下几种数据类型     NULL 该值为NULL 空值。     INTEGER 有符号整数型。     REAL 浮点型     TEXT 文本字符串,存储使用的编码方式为UTF-8 ,UTF-16BE , UTF-6LE 等。     // 存储特点 动态类型     sqlite 采用的是动态数据类型。 传统的关系数据库使用的是静态数据类型-》表声明时的字段类型为字段存储的数据类型。     sqlite 而言,即便在声明时确定了类型,我们仍然可以存储其他类型。这是由于它的类型亲缘性决定的。     可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。     例如: sqlite 存储类别 可以包含6中不同长度的interger类型,但是一旦被读到内存中都会被认为是占用8个字节的无符号整形。     // 注意: 尽管SQLite为我们提供了这种方便,但是一旦考虑到数据库平台的可移植性问题,我们在实际的开发中还是应该尽可能的保证数据类型的存储和声明的一致性。     为了和 其他数据库 数据类型兼容, sqlite 具有数据亲缘性 ,可以理解为 把你所给的类型 自动转换为它的数据类型。     例如: 声明的时候字段类型为INT , INTEGER , 或者 SMALLINT  等  统一为  INTERER     例如给     // 目前支持一下五种亲缘类型:     interger  整形     real   浮点型     text   文本类型 或者文本与数字组合(65535个字符)     numeric     字段的亲缘性是根据该字段在声明时被定义的类型来决定的,具体的规则可以参照以下列表。需要注意的是以下列表的顺序,即如果某一字段类型同时符合两种亲缘性,那么排在前面的规则将先产生作用。     1). 如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。     2). 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。     3). 如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。     4). 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型是REAL。     5). 其余情况下,字段的亲缘类型为NUMERIC。     INT     INTEGER     TINYINT     SMALLINT     MEDIUMINT     BIGINT                  INTEGER        1     UNSIGNED BIG INT     INT2     INT8     CHARACTER(20)     VARCHAR(255)     VARYING CHARACTER(255)   TEXT            2     NCHAR(55)     NATIVE CHARACTER(70)     NVARCHAR(100)     TEXT     CLOB  (字符大对象,保存大量基于字符的数据)     BLOB  (二进制大对象,保存图片,视频,音乐等)   none    3     NULL     REAL     DOUBLE     DOUBLE PRECISION     REAL              4     FLOAT     NUMERIC     DECIMAL(10,5)   numeric(进而转化为其他类型)           5     BOOLEAN     DATE     DATETIME     当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。     注意: 不建议把大文件存在SQL 里面,DB文件变大则效率下降。 可以把大数据放在沙盒文件夹里面,数据库里面记录相应的路径。     // 开始使用SQLite     // 1. 导入框架 libsqlite3.0.dylib     // 2. 引入<sqlite3.h>     // 3. 打开数据库     // 4. 执行sql语句     // 5. 关闭数据库     */    return YES;}@end///////////////////////////////////////////////////////////////////////  DataBaseHandle.h//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//  此为数据库操作类,为单例类.//  主要功能:数据库的打开和关闭,数据库的添加, 删除, 修改, 查询操作.#import <Foundation/Foundation.h>#import <sqlite3.h>//导入sqlite3 头文件#import "Student.h"@interface DataBaseHandle : NSObject// 打开数据库+ (sqlite3 *)open;// 关闭数据库+ (void)close;// 添加数据+ (BOOL)insertStudent:(Student *)student;// 删除数据+ (BOOL)deleteStudent:(Student *)student;// 更改数据 -> 更改密码+ (BOOL)updateStudent:(Student *)student pwd:(NSString *)pwd;// 查询某一数据+ (Student *)findStudentByUID:(NSInteger)uid;// 查询所有数据+ (NSArray *)findAllStudents;@end////  DataBaseHandle.m//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import "DataBaseHandle.h"#define KDBName @"SHS150711.sqlite"//数据库指针(对象)static sqlite3 *db = nil;@implementation DataBaseHandle//打开数据库+ (sqlite3 *)open{    @synchronized(self){    //打开过了直接返回        if (db != nil) {            return db;        }else{            //数据库路径  //数据库对象地址,通过地址改值,返回一个打开的数据库            //1. 数据库路径            //注意: 数据库是备份的数据,需要备份的数据都是存放在沙盒的Documents里面.            NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];            NSString *dbPath = [documentsPath stringByAppendingPathComponent:KDBName];            //2.打开数据库            //创建并且打开数据库,如果没有该数据库会自动创建并且打开            int result = sqlite3_open(dbPath.UTF8String, &db);//该函数的作用是打开路径数据库,并且给db赋值            //3.判断数据库是否打开,如果打开,则创建数据库表            if (result == SQLITE_OK) {                //4.sql语句                NSString *sqlString = @"CREATE TABLE 'studentInfo' ('uid' INTEGER PRIMARY KEY NOT NULL, 'username' TEXT, 'pwd' TEXT)";                //5.执行sql语句                // sqlite3 执行函数                // db 数据库指针                // sql sql语句 c字符串                // 回调函数, 查询时使用                // 作用: 数据库db执行sqlString语句, 并返回执行结果, int型.                int result2 = sqlite3_exec(db, sqlString.UTF8String, nil, nil, nil);                if (result2 == SQLITE_OK) {                    NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"表创建成功");                }else{                    NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"表创建失败, 或者已经创建过了");                }            }// if 结果            return db;                                                          }// else 结果    }// sync 结束}//关闭数据库+ (void)close{    int result = sqlite3_close(db);    if (result == SQLITE_OK) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据库关闭");    }}//添加数据+ (BOOL)insertStudent:(Student *)student{    BOOL isSuccess = NO;    //1.数据库对象    sqlite3 *db = [self open];    //2.sql 语句    NSString *sqlString = [NSString stringWithFormat:@"INSERT INTO 'studentInfo' values(%ld, '%@', '%@')", student.uid, student.username, student.pwd];    //3. 执行exec    int result = sqlite3_exec(db, sqlString.UTF8String, nil, nil, nil);    if (result == SQLITE_OK) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据插入成功");        isSuccess = YES;    }else{        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据插入失败");    }    return isSuccess;}//删除数据+ (BOOL)deleteStudent:(Student *)student{    BOOL isSuccess = NO;    //1. 数据库对象    sqlite3 *db = [self open];    //2.sql 语句    NSString *sqlString = [NSString stringWithFormat:@"DELETE FROM 'studentInfo' WHERE uid = %ld", student.uid];    //3.执行    int result = sqlite3_exec(db, sqlString.UTF8String, nil, nil, nil);    if (result == SQLITE_OK) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据删除成功");        isSuccess = YES;    }else{        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据删除失败");    }    return isSuccess;}//更改数据 更改密码+ (BOOL)updateStudent:(Student *)student pwd:(NSString *)pwd{     BOOL isSuccess = NO;    //1.db    sqlite3 *db = [self open];    //2.sqlString    NSString *sqlString = [NSString stringWithFormat:@"UPDATE 'studentInfo' set pwd = '%@' WHERE uid = %ld", pwd, student.uid];    NSLog(@"%@", sqlString);    //3.exec    int result = sqlite3_exec(db, sqlString.UTF8String, nil, nil, nil);    if (result == SQLITE_OK) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据更新成功");        isSuccess = YES;    }else{        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"数据更新失败");    }    return isSuccess;}//查询某一数据+ (Student *)findStudentByUID:(NSInteger)uid{    Student *student = nil; //创建返回对象    //1.db对象    sqlite3 *db = [self open];    //2.sql语句    NSString *sqlString = [NSString stringWithFormat:@"SELECT * FROM 'studentInfo' WHERE uid = %ld", uid];    //3.创建stmt  statement 语句对象    sqlite3_stmt *stmt = nil; //作用:执行sql语句    //4.预执行, 查看有无语法错误,给stmt赋值sql语句    //sqlite3_prepare_v2()    //db 数据库对象    //sql 语句    //-1 语句执行长度, -1 为全部长度    //@stmt 语句对象地址,如果预执行正确则赋值给stmt sql语句    //nil 没有执行的sql语句,一般给nil    int result = sqlite3_prepare_v2(db, sqlString.UTF8String, -1, &stmt, nil);    //5.判断, 如果预执行成功, 6.执行相关的操作    if (result == SQLITE_OK) {        //6.执行 sqlite3_step(stmt), 执行函数有返回值,如果是插入,删除,更新,返回值为SQLITE_DOWN, 如果是查找操作,则会返回SQLITE_ROW,当前行并且指向下一行,直到没有值,返回SQLITE_DOWN        if (sqlite3_step(stmt) == SQLITE_ROW) {            //7.如果有值,则逐列取值,sqlite3_column_类型(stmt,列下标, 从0开始)            //uid       username   pwd            //integer   text       text            NSInteger uid = sqlite3_column_int(stmt, 0);            const unsigned char *cName = sqlite3_column_text(stmt, 1);            //username            NSString *username = [NSString stringWithUTF8String:(const char*)cName];            //pwd            NSString *pwd = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];            student  = [[Student alloc] initWithUID:uid username:username pwd:pwd];        }//if step 结束    }//if result 结束    //8.释放stmt 语句对象,最后都要释放,不管执行是否正确    sqlite3_finalize(stmt);    if (student == nil) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"查找失败");    }else {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"查找成功");    }    return student;}//查询所有数据+ (NSArray *)findAllStudents{    //返回值可变数组    NSMutableArray *studentArr = [NSMutableArray array];    //1.db    sqlite3 *db = [self open];    //2.sql    NSString *sqlString = @"SELECT *  FROM 'studentInfo'; ";    //3.stmt    sqlite3_stmt *stmt = nil;    //4.prepare_v2    int result = sqlite3_prepare_v2(db, sqlString.UTF8String, -1, &stmt, nil);    //5.判断    if (result == SQLITE_OK) {        //6.执行查询多条记录,需要用while语句        // == row 说明有值,则取值        while (sqlite3_step(stmt) == SQLITE_ROW) {            //7.逐列取值            //uid            NSInteger uid = sqlite3_column_int(stmt, 0);            //username            NSString *username = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 1)];            //pwd            NSString *pwd = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];            Student *student = [[Student alloc] initWithUID:uid username:username pwd:pwd];            [studentArr addObject:student];        }//while 查询结束    }//if prepare 结束    //8.释放 finalize    sqlite3_finalize(stmt);    if (studentArr.count == 0) {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"没有数据,或查找失败");    }else {        NSLog(@"%s %d %@", __FUNCTION__, __LINE__, @"查找成功");    }    return studentArr;}@end////////////////////////////////////////////////////////////////////////  ViewController.h//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end////  ViewController.m//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import "ViewController.h"#import "DataBaseHandle.h"#import "Student.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    //沙盒路径    NSLog(@"%@", NSHomeDirectory());    // 打开数据库    [DataBaseHandle open];    //关闭数据库//    [DataBaseHandle close];    //插入数据    Student *stu1 = [[Student alloc] initWithUID:1 username:@"印磊" pwd:@"王右"];    [DataBaseHandle insertStudent:stu1];    //删除数据//    [DataBaseHandle deleteStudent:stu1];    //更新数据//    [DataBaseHandle updateStudent:stu1 pwd:@"王左"];    //查询某一数据    Student *stu2 = [DataBaseHandle findStudentByUID:1];    NSLog(@"%@", stu2.username);    //查找所有数据    NSArray *array = [DataBaseHandle findAllStudents];    NSLog(@"%@", array);    // Do any additional setup after loading the view, typically from a nib.}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}@end/////////////////////////////////////////////////////////////////////////  Student.h//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//model类#import <Foundation/Foundation.h>@interface Student : NSObject@property (nonatomic, assign) NSInteger uid;@property (nonatomic, copy) NSString *username;@property (nonatomic, copy) NSString *pwd;//自定义初始化方法- (instancetype)initWithUID:(NSInteger)uid username:(NSString *)username pwd:(NSString *)pwd;@end////  Student.m//  UI19_SQLite////  Created by l on 15/9/25.//  Copyright (c) 2015年 . All rights reserved.//#import "Student.h"@implementation Student- (instancetype)initWithUID:(NSInteger)uid username:(NSString *)username pwd:(NSString *)pwd{    self = [super init];    if (self) {        self.uid = uid;        self.username = username;        self.pwd = pwd;    }    return self;}@end
0 0