基础数据持久化:SQLite与CoreData的应用
立即解锁
发布时间: 2025-08-24 01:11:21 阅读量: 1 订阅数: 7 

### 基础数据持久化:SQLite与Core Data的应用
#### 一、使用绑定变量
在数据库操作中,虽然可以构造SQL字符串来插入值,但通常会使用绑定变量。正确处理字符串,确保其没有无效字符且引号插入正确,是一项繁琐的任务。而使用绑定变量可以解决这些问题。
使用绑定变量插入值时,先正常创建SQL语句,在SQL字符串中放入问号(?),每个问号代表一个变量,在执行语句前必须绑定这些变量。然后准备SQL语句,为每个变量绑定值,最后执行命令。
以下是一个示例,准备一个带有两个绑定变量的SQL语句,将一个整数绑定到第一个变量,一个字符串绑定到第二个变量,然后执行并完成该语句:
```c
char *sql = "insert into foo values (?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 235);
sqlite3_bind_text(stmt, 2, "Bar", -1, NULL);
}
if (sqlite3_step(stmt) != SQLITE_DONE)
NSLog(@"This should be real error checking!");
sqlite3_finalize(stmt);
```
绑定语句的语法可能看起来有点奇怪,因为我们在进行插入操作。使用绑定变量时,查询和更新使用相同的语法。如果SQL字符串是一个查询,而不是更新,需要多次调用`sqlite3_step()`,直到它返回`SQLITE_DONE`。由于这是一个更新操作,我们只调用一次。
大多数绑定函数只接受三个参数:
1. 任何绑定函数的第一个参数,无论数据类型如何,都是之前在`sqlite3_prepare_v2()`调用中使用的`sqlite3_stmt`的指针。
2. 第二个参数是要绑定的变量的索引,这是一个从1开始的索引值,即SQL语句中的第一个问号索引为1,后续的依次加1。
3. 第三个参数总是要替换问号的值。
一些绑定函数,如绑定文本和二进制数据的函数,还有两个额外的参数:
1. 第一个额外参数是第三个参数中传递的数据的长度。对于C字符串,可以传递 -1 而不是字符串的长度,函数将使用整个字符串。在其他情况下,需要告知传递的数据的长度。
2. 最后一个参数是一个可选的函数回调,用于在语句执行后进行内存清理。通常,这样的函数用于释放使用`malloc()`分配的内存。
#### 二、SQLite3应用
在Xcode中,使用单视图应用程序模板创建一个新项目,命名为`SQLite Persistence`,并确保关闭`Use Storyboard`选项。
操作步骤如下:
1. 打开`BIDViewController.h`文件,进行如下更改:
```objc
#import <UIKit/UIKit.h>
@interface BIDViewController : UIViewController
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *lineFields;
@end
```
2. 选择`BIDViewController.xib`,按照相关说明设计视图并连接输出集合,设计完成后保存nib文件。
接下来,我们将使用SQLite3存储数据,使用一个表,将字段值存储在该表的四行中,为每行分配一个与字段对应的行号。
##### (一)链接SQLite3库
SQLite 3通过一个过程式API访问,该API提供了许多C函数调用的接口。要使用这个API,需要将应用程序链接到一个名为`libsqlite3.dylib`的动态库,该库位于Mac OS X和iOS的`/usr/lib`中。链接动态库到项目的过程与链接框架相同。
具体步骤如下:
1. 选择项目导航器列表最顶部的`SQLite Persistence`项,然后在主区域的`TARGETS`部分选择`SQLite Persistence`。
2. 选择`SQLite Persistence`目标后,点击最右侧面板的`Build Phases`标签。
3. 展开`Link Binary With Libraries`项,点击链接框架列表底部的`+`按钮,会弹出一个列出所有可用框架和库的面板。
4. 在列表中找到`libsqlite3.dylib`(可以使用搜索字段),点击`Add`按钮。注意,该目录中可能有几个以`libsqlite3`开头的其他条目,确保选择`libsqlite3.dylib`,它是一个始终指向SQLite3库最新版本的别名。添加到项目后,它会出现在项目导航器的顶层,为了保持组织有序,可以将其拖到项目的`Frameworks`文件夹中。
##### (二)修改持久化视图控制器
选择`BIDViewController.m`文件,进行如下更改:
```objc
#import "BIDViewController.h"
#import <sqlite3.h>
@interface BIDViewController ()
@end
@implementation BIDViewController
- (NSString *)dataFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"];
}
- (void)viewDidLoad
{
[super viewDidLoad];
sqlite3 *database;
if (sqlite3_open([[self dataFilePath] UTF8String], &database)
!= SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS "
"(ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT
```
0
0
复制全文
相关推荐










