关于iOS中SQLITE句柄的使用的细节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于iOS中SQLITE句柄的使用的细节相关的知识,希望对你有一定的参考价值。

1、设计思想:给SQLITE进行封装,利用定义的类别实现方法的简洁,以便达到低耦合效果

 1 控制器代码:
 2 #import "ViewController.h"
 3 #import "DatabaseHelper.h"
 4 
 5 @interface ViewController ()
 6 {
 7      sqlite3 *db;
 8 }
 9 @end
10 
11 @implementation ViewController
12 
13 -(void)loadView {
14 
15     [super loadView];
16     self.view.backgroundColor = [UIColor orangeColor];
17 }
18 - (void)viewDidLoad {
19     [super viewDidLoad];
20     //PART1:该部分为实现的帮助类别
21     //PART1 .1
22   [DatabaseHelper openDatabaseWithName:@"personinfo.sqlite" withSqlite:db];
23     //PART1 .2
24    db =[DatabaseHelper openDatabaseWithName:@"personinfo.sqlite" withSqlite:db]; 
25 NSLog(@" isOpenOrCreat = %@",db ?@"sucess":@"failure");
26
27 //PART2:用以判断数据库是否打开
28 if (db) {
29
30 }
31
32 //PART3:用以判断数据库是否打开
33 [DatabaseHelper execSql:@"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)" withSqlite:db];

 


 1 操作类代码:
 2 #import "DatabaseHelper.h"
 3 
 4 @implementation DatabaseHelper
 5 +(sqlite3 *)openDatabaseWithName:(NSString *)name  withSqlite:(sqlite3 *)sqlite3{
 6     //PART5:
 7     //1、获取Documents文件路径
 8     NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
 9     //2、拼接要建立的数据库文件路径
10     NSString *databasePath = [documentsPath stringByAppendingPathComponent:name];
11     //打印
12     NSLog(@"databasePath = %@",databasePath);
13     //判断是否已经打开(打开失败时关闭数据库并log提示)
14     if (sqlite3_open([databasePath UTF8String], &sqlite3) != SQLITE_OK) {
15         sqlite3_close(sqlite3);
16         NSLog(@"数据库打开失败");
17         return nil ;
18     }
19 
20 //PART4:
21 //    char *err;
22 //    NSString *sql = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";
23 //    if (sqlite3_exec(sqlite3, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
24 //        sqlite3_close(sqlite3);
25 //        NSLog(@"数据库操作数据失败!");
26 //        NSLog(@"%s ",err);
27 //    }
28 
29     return  sqlite3;
30 }
31 
32 +(BOOL)execSql:(NSString *)sql  withSqlite:(sqlite3 *)sqlite3{
33     char *err;
34     //sqlite3_exec(),   执行非查询的sql语句
35     if (sqlite3_exec(sqlite3, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
36         sqlite3_close(sqlite3);
37         NSLog(@"数据库操作数据失败!");
38         return NO;
39     }
40     return YES;
41 
42 }

 


问题:
1、当注掉PART1.1                          数据库可以被写入
2、当注掉PART1.1、PART4              后数据库不能被写入 
3、当注掉PART1.2、PART4              数据库可以被写入

结论:
1、句柄的存在必须依赖于上下文,数据库的操作必须依赖于句柄存在的内容。
2、只有句柄前后相对应才能实现对数据库的操作.
 
 
 

以上是关于关于iOS中SQLITE句柄的使用的细节的主要内容,如果未能解决你的问题,请参考以下文章

使用片段从数据库 SQLite 获取数据时出错

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

什么是句柄?

如何在片段中访问 SQLite 数据到 ListView

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]