zoukankan      html  css  js  c++  java
  • 关于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、只有句柄前后相对应才能实现对数据库的操作.
     
     
     
  • 相关阅读:
    微信redirect_uri 回调错误,scope权限错误
    对“空间数据库”的理解
    空间数据库2
    PostgreSQL和MySQL
    shp文件和地理数据库文件的区别
    分布式 空间数据库
    Git使用教程
    栅格投影
    mapnik渲染原理
    高斯消元——浮点数模板
  • 原文地址:https://www.cnblogs.com/tig666666/p/5942679.html
Copyright © 2011-2022 走看看