`

iPhone开发数据持久化总结之第4篇—sqlite3数据库 .

    博客分类:
  • ios
阅读更多
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8284135 作者:张燕广


实现的功能:1)演示使用sqlite3持久化数据。

关键词:数据持久化 sqlite3 数据库




1、将上一篇iPhone开发【二十二】数据持久化总结之第3篇归档(NSKeyedArchiver、NSKeyedUnarchiver)的工程拷贝一份,名称修改为Persistence-sqlite,工程结构如下:
[img]

[/img]
Person类已经没用了,可以删掉。








2、为工程添加sqlite3的库libsqlite3.dylib,如下图所示:
[img]

[/img]






3、主要修改了ViewController类,ViewController.h如下:

#define kFileName @"archive"
#define kDataKey @"Data"
#define kSqliteFileName @"data.db3"

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property(nonatomic,retain)IBOutlet UITextField *name;
@property(nonatomic,retain)IBOutlet UITextField *gender;
@property(nonatomic,retain)IBOutlet UITextField *age;
@property(nonatomic,retain)IBOutlet UITextField *education;

-(NSString *)dataFilePath;
-(void)applicationWillResignActive:(NSNotification *)nofication;

@end



ViewController.m如下:
#import "ViewController.h"
#import "Person.h"
#import <sqlite3.h>

@implementation ViewController
@synthesize name,gender,age,education;

-(NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //return [documentsDirectory stringByAppendingPathComponent:kFileName];
    return [documentsDirectory stringByAppendingPathComponent:kSqliteFileName];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
	// Do any additional setup after loading the view, typically from a nib.
    NSString *filePath = [self dataFilePath];
    NSLog(@"filePath=%@",filePath);
    
    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
        //属性列表
        /*
        NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
        name.text = [array objectAtIndex:0];
        gender.text = [array objectAtIndex:1];
        age.text = [array objectAtIndex:2];
        education.text = [array objectAtIndex:3];
        
        [array release];*/
        
        //归档
        /*
        NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[self dataFilePath]];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
        Person *person = [unarchiver decodeObjectForKey:kDataKey];
        [unarchiver finishDecoding];
        
        name.text = person.name;
        gender.text = person.gender;
        age.text = person.age;
        education.text = person.education;
        
        [unarchiver release];
        [data release];*/
        
        //sqlite3
        sqlite3 *database;
        //打开数据库
        if(sqlite3_open([filePath UTF8String], &database)!=SQLITE_OK){//备注1
            //数据库打开失败,关闭数据库
            sqlite3_close(database);
            NSAssert(0,@"打开数据库失败");
        }
        
        char* errorMsg;
        NSString *createSQL = @"CREATE TABLE IF NOT EXISTS PERSON (name TEXT PRIMARY KEY,gender TEXT,age TEXT,education TEXT);";
        //创建表
        if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK){//备注2
            //创建表失败,关闭数据库
            sqlite3_close(database);
            NSAssert1(0, @"创建表失败:%s", errorMsg);
        }
        
        //查询表
        NSString *querySQL = @"SELECT name,gender,age,education FROM PERSON ORDER BY name";

        //执行查询,遍历查询结果
        sqlite3_stmt *statment;
        if(sqlite3_prepare_v2(database, [querySQL UTF8String], -1, &statment, nil) == SQLITE_OK){//备注3
            //查询成功,执行遍历操作
            while(sqlite3_step(statment) == SQLITE_ROW){//备注4
                const char* pName = (char*)sqlite3_column_text(statment, 0);//备注5
                if(pName!=NULL){
                    self.name.text = [[NSString alloc]initWithUTF8String:pName];
                }
                
                char* pGender = (char*)sqlite3_column_text(statment, 1);
                if(pGender!=NULL){
                    self.gender.text = [[NSString alloc]initWithUTF8String:pGender];
                }
                
                char* pAge = (char*)sqlite3_column_text(statment, 2);
                if(pAge!=NULL){
                    self.age.text = [[NSString alloc]initWithUTF8String:pAge];
                }
                
                char* pEducation = (char*)sqlite3_column_text(statment, 3);
                if(pEducation!=NULL){
                   self.education.text = [[NSString alloc]initWithUTF8String:pEducation]; 
                }
            }
            sqlite3_finalize(statment);//备注6
        }
        //关闭数据库
        sqlite3_close(database);//备注7
    }
    
    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
    
    [super viewDidLoad];
}

-(void)applicationWillResignActive:(NSNotification *)nofication{
    
    //属性列表
    /*
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:name.text];
    [array addObject:gender.text];
    [array addObject:age.text];
    [array addObject:education.text];
    [array writeToFile:[self dataFilePath] atomically:YES];
    [array release];*/
    
    //归档
    /*
    Person *person = [[Person alloc]init];
    person.name = name.text;
    person.gender = gender.text;
    person.age = age.text;
    person.education = education.text;
    
    NSMutableData *data = [[NSMutableData alloc]init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:person forKey:kDataKey];
    [archiver finishEncoding];
    
    [data writeToFile:[self dataFilePath] atomically:YES];
    [person release];
    [archiver release];
    [data release];*/
    
    //sqlite3
    sqlite3 *database;
    //打开数据库
    if(sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK){
        //数据库打开失败,关闭数据库
        sqlite3_close(database);
        NSAssert(0,@"打开数据库失败");
    }
    
    char* errorMsg;
    NSString *updateSQL = @"INSERT OR REPLACE INTO PERSON(name,gender,age,education) VALUES(?,?,?,?);";
    //执行插入或更新操作
    sqlite3_stmt *statment;
    if(sqlite3_prepare_v2(database, [updateSQL UTF8String], -1, &statment, nil) == SQLITE_OK){
        //绑定变量
        sqlite3_bind_text(statment, 1, [self.name.text UTF8String], -1, NULL);//备注8
        sqlite3_bind_text(statment, 2, [self.gender.text UTF8String], -1, NULL);
        sqlite3_bind_text(statment, 3, [self.age.text UTF8String], -1, NULL);
        sqlite3_bind_text(statment, 4, [self.education.text UTF8String], -1, NULL);
    }
    if(sqlite3_step(statment)!=SQLITE_DONE){
        NSAssert1(0, @"更新表失败:%s", errorMsg);
    }
    sqlite3_finalize(statment);
    //关闭数据库
    sqlite3_close(database);
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.name = nil;
    self.gender = nil;
    self.age = nil;
    self.education = nil;
}

-(void)dealloc{
    [name release];
    [gender release];
    [age release];
    [education release];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
	[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
	[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end



代码解释:

备注1:sqlite3_open():打开数据库


在操作数据库之前,首先要打开数据库。

这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。


第1个参数:数据文件路径必须用C风格字符串(不能用NSString),[filePath UTF8String]将filePath转换为C风格字符串。

第2个参数:是返回的数据库连接对象。


备注2:sqlite3_exec():执行SQL语句
      第1个参数:数据库指针,是前面open函数得到的指针
      第2个参数:const char *sql是一条sql 语句,以\0结尾。
      第3个参数:sqlite3_callback 是回调,当这条语句执行之后,sqlite3会调用这个回调函数。
      第4个参数:void*是一个指针,可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL
备注3:sqlite3_prepare_v2():将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针
     第1个参数:数据库指针,是前面open函数得到的指针
     第2个参数:sql语句,必须是C风格字符串
     第3个参数:如果该参数小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止
    第4个参数:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
备注4:sqlite3_step()
    这个过程用于执行有前面sqlite3_prepare创建的准备语句。这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()直到这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回
备注5:sqlite3_column_text()
    从结果集中获取各列的值,需要注意的是:第一列的索引是0。
备注6:sqlite3_finalize()

这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。

在空指针上调用这个函数没有什么影响,同时可以在准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用

sqlite_reset之后,或者在sqlite3_step任何调用之后。

备注7:sqlite3_close()

          关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放掉。

备注8:sqlite3_bind_text()

第1个参数:指向在sqlite3_prepare_v2()调用中使用的sqlite3_stme。

第2个参数:所绑定的变量的索引(sql语句中第一个问号的索引),需要注意的是:第一个问号的索引是1,而不是0。

第3个参数:只有少数绑定函数,比如用于绑定文本或二进制数据的绑定函数,这个参数用来设定传递数据的长度。对于C字符串,可以传递-1来代替字符串的长度,意思是要是要使用整个字符串。

第4个参数:回调函数,一般用于在语句执行后做内存清理相关的工作。可以设置为NULL。
4、数据库文件的保存位置是: /Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/CC47C118-7FE7-4718-A4AA-635FBCC36AED/Documents/data.db3

[img]

[/img]




  • 大小: 36.5 KB
  • 大小: 24.8 KB
  • 大小: 80.3 KB
分享到:
评论

相关推荐

    sqlite 数据库

    在iPhone应用开发中,SQLite通常用于存储应用配置、用户数据或其他需要持久化的信息。通过FMDB这样的库,开发者可以方便地在Objective-C或Swift代码中执行SQL命令,实现对SQLite数据库的读写操作。 综上所述,...

    Iphone数据库访问技术

    "Iphone数据库访问技术"主要涉及如何在iPhone应用中有效地使用数据库系统,尤其是SQLite,这是iOS开发中最常用的轻量级数据库。SQLite是一个嵌入式关系型数据库,它不需要单独的服务器进程,可以直接在应用程序中...

    iPhone3开发基础教程

    - **数据管理**:介绍了如何在应用中管理和存储数据,包括使用Core Data框架进行持久化存储,以及如何使用SQLite数据库。 #### 3. 高级特性 - **多线程与后台任务**:教授如何实现多线程编程,处理后台任务,如下载...

    iPhone开发书籍大全].Beginning.iPhone.SDK.Programming.with.Objective-C

    ##### 第三部分:数据展示与持久化 - **第10章**:使用TableView - TableView的基本概念与实现方式 - 动态加载数据到TableView - TableView的分组与排序功能 - **第11章**:应用偏好设置 - 存储和读取用户偏好...

    Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存

    总结来说,Unity3D游戏场景的切换和数据持久化是游戏开发的核心技术。理解并掌握这些技能,开发者能够创建更流畅、更丰富的游戏体验,同时确保玩家的进度得到妥善保存。在实际项目中,结合使用各种存储方法,可以...

    iPhone开发秘籍:第2版(The iPhone Developer's Cookbook)

    - **持久化存储**:Core Data提供了一种高效的方式来管理和存储应用的数据模型对象,支持SQLite数据库和XML文件等多种存储形式。 - **数据映射与转换**:介绍如何将对象模型映射到数据库表结构,以及如何在不同数据...

    iPhone SDK 3开发指南

    7. 核心数据和数据库管理:iPhone SDK 3中的Core Data框架用于数据持久化管理。它为开发者提供了一种机制,允许对象模型与存储在SQLite数据库中的数据之间进行映射。掌握Core Data的使用是实现复杂数据管理功能不可...

    iphone开发教程10

    4. 数据管理:学习使用Core Data进行持久化数据存储,或使用SQLite数据库。 5. 视图控制器:理解UIViewController的生命周期,以及如何实现页面间的导航。 6. 事件处理:学习处理用户触摸事件和手势识别。 7. 网络...

    千锋源码 iphone开发sql部分 包含三方库的用法

    虽然苹果的Core Data框架也可以实现数据持久化,但它的学习曲线较陡峭,而SQLite则更适合那些已经熟悉SQL的开发者。 提到的“三方库”,可能包括FMDB和SQLite.swift等。FMDB是Objective-C编写的SQLite库,它封装了...

    《iPhone开发秘籍_第2版》PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于iPhone应用开发的专业书籍——《iPhone开发秘籍_第2版》,并且提供了该书PDF版本的下载链接。下面将对这本书可能涉及的关键知识点进行详细的介绍。 ### 一、iOS开发...

    iPhone开发基础教程-PDF完整版 part 2

    - **Core Data**: iOS应用的数据管理框架,提供了对象持久化存储功能。 - **SQLite数据库**: 嵌入式数据库解决方案,适用于需要复杂查询功能的应用。 - **UserDefaults**: 简单的数据存储方案,适用于存储小量配置...

    《iPhone开发基础教程》.pdf

    3. **第12章:数据持久化与网络编程** - 数据存储选项:在iOS应用中,数据可以存储在多种地方,如UserDefaults、SQLite数据库或Core Data。这一章会介绍这些存储机制,并提供使用示例。 - JSON解析:JSON是一种...

    iphone开发秘籍第2版-2~12章源码

    5. **数据持久化**:6章可能会讲解在iOS中保存和恢复数据的方法,如NSUserDefaults、SQLite数据库和Core Data。 6. **网络编程**:7章可能涉及网络请求,包括使用NSURLConnection、NSURLSession进行HTTP请求,以及...

    Beginning iPhone 3 Development souce/ iPhone 开发基础教程 源代码

    3. **To-Do List**:一个常见的任务管理应用,涵盖了数据持久化(如SQLite数据库)和用户界面管理,让开发者了解如何存储和检索用户数据。 4. **Location Awareness**:利用iPhone的GPS功能,实现地理位置感知的...

    iPhone开发实战上部

    7. **SQLite数据库**:对于需要本地数据存储的应用,SQLite是常见选择。书中会教授如何使用SQLite管理数据库,执行SQL查询,并通过Core Data框架与应用交互。 8. **Core Data**:Apple的持久化框架,用于管理应用...

    iPhone开发秘籍(The iphone developer cookbook)(第2版)(英文版)

    - **SQLite数据库应用**:教授如何在iPhone应用中集成SQLite数据库,实现高效的数据检索和管理。 #### 网络通信 - **网络编程基础**:涵盖HTTP请求、JSON解析、异步数据加载等网络编程基础知识。 - **WebSocket实战...

    iPhone开发基础教程.rar

    5. **数据存储**:iOS开发中,数据管理涉及UserDefaults、SQLite数据库、Core Data等技术。学习如何持久化用户数据,以及何时选择何种数据存储方案,是提升应用功能的重要环节。 6. **网络编程**:iOS应用常常需要...

    《Iphone开发秘籍》实例代码第一部分

    5. **数据持久化**:学习如何使用Core Data存储应用程序的数据,或者使用文件系统、SQLite数据库等其他方式实现数据持久化。 6. **网络编程**:了解如何使用URLSession进行HTTP请求,获取JSON或其他格式的网络数据...

    使用CoreData开发iPhone手机应用软件的实例教程.pdf

    Core Data的核心是SQLite数据库,它提供了结构化的数据存储解决方案。 教程还涵盖了多个关键的编程概念和技术,如: 1. **委托(Delegate)**:这是一种设计模式,用于对象间的通信,让一个对象能够接收另一个对象...

    iphone 开发基础教程 源代码

    学习如何使用Core Data存储应用数据,或者利用SQLite数据库进行更底层的数据管理,是实现应用功能的重要一环。 7. 网络编程与API集成 了解如何使用URLSession进行网络请求,或者集成第三方API来获取和发送数据,...

Global site tag (gtag.js) - Google Analytics