免费开源的iOS开发学习平台

SQLite入门:1-数据库的操作

对于简单的数据,我们完全可以使用Plist来存取数据。随着数据逐渐变大,查询数据和修改数据就会变得越来越麻烦。另外,使用Plist来存取数据无法解决的一个问题是,每次查询数据需要将整个文件都加载到内存中,如果文件很大这显然是不合适的。此时,我们就需要使用到SQLite。

SQLite是一个数据库引擎,无需服务端支持即可直接运行在客户端上。SQLite使用非常广泛,在每一台iOS设备,Android设备,Mac电脑,Windows10上面都能使用SQLite。就像其他数据库一样,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接,并且SQLite 直接访问其存储文件。

数据类型

存储在SQLite数据库中的数据具有以下几种存储类型。

| 存储类型 | 描述 |
| --- | --- |
| NULL | 值是一个 NULL 值。 |
| INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
| REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
| TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
| BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |

导入SQLite

在开发过程中,如果我们希望使用SQLite,则需要预先导入SQLite的库文件。

首先创建一个Single View Application工程,在工程的TARGETS中选择Build Phases选项,在Link Binary With Libraries中添加libsqlite3.dylib到工程中。在添加的过程中,我们会发现存在libsqlite3.dylib和libsqlite3.0.tbd。这两者的区别是:libsqlite3.dylib总是链向最新的libsqlite库,目前最新的是libsqlite3.0。也就是说如果以后有libsqlite3.1.tbd,则链向的是libsqlite3.1.tbd。

添加依赖库的图片

在程序需要使用SQLite的类中添加头文件。

#import <sqlite3.h>

#创建数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。
现在我们来创建一个SQLite数据库。

  • 在控制器类中添加一个sqlite3类型的属性
@interface ViewController ()
@property (nonatomic, assign) sqlite3 *db;
@end
  • 在ViewController.m中,添加如下的方法,用户创建一个SQLite数据库
- (BOOL)openDatabaseWithName:(NSString *)databaseName {
    NSString *docsDir = nil;
    NSArray *dirPath = nil;
    
    // 获取文档目录路径
    dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPath objectAtIndex:0];
    
    // 拼接数据库路径
    NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: databaseName]];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    const char *dbPath = [databasePath UTF8String];
    if (![fileManager fileExistsAtPath: databasePath ]) {
        if (sqlite3_open(dbPath, &_db) == SQLITE_OK) {
            NSLog( @"数据库 打开/创建 成功:%@", databasePath);
            return YES;
        }
        else {
            NSLog( @"数据库 打开/创建 失败:%@", databasePath);
            return NO;
        }
    }else{
        NSLog(@"数据库已创建: %@", databasePath);
        if (sqlite3_open(dbPath, &_db) == SQLITE_OK) {
            NSLog( @"数据库 打开/创建 成功:%@", databasePath);
            return YES;
        }
        else {
            NSLog( @"数据库 打开/创建 失败:%@", databasePath);
            return NO;
        }
        return YES;
    }
}

我们可以在viewDidLoad方法中执行这个方法,会有以下的输出结果。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self openDatabaseWithName:@"99iOS.sqlite"];
}

我们打开应用程序的沙盒路径,可以查看已经创建的数据库文件。

在上面的代码中,函数sqlite3_open用来创建/打开一个数据库。如果dbPath路径上有数据库则打开,没有则新建一个数据库,并把值赋给db指针。该函数有一个输入参数filename和一个输出函数ppDb。

SQLITE_API int SQLITE_STDCALL sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

在对数据库操作完成之后记得要执行sqlite3_close函数关闭数据库,来回收系统资源。

- (void)closeDB {
    if (NULL == _db) {
        NSLog(@"数据库不存在");
    } else {
        sqlite3_close(_db); // 关闭数据库
    }
}

示例代码

https://github.com/99ios/13.5.1