-(void) addObserver{ //当程序进入后台时执行操作 UIApplication *app = [UIApplication sharedApplication]; [[ NSNotificationCenter defaultCenter] addObserver: self selector:@selector(appwillresignActive) name:UIApplicationWillResignActiveNotification object:app]; } -(void) appwillresignActive{ NSLog(@"监听测试"); }
头部引入
#import "sqlite3.h"
-(void) makeDBinfo{ NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"]; char *errorMsg; //打开或创建数据库 sqlite3 *database; if (sqlite3_open([databaseFilePath UTF8String], &database)!=SQLITE_OK) { sqlite3_close(database); }else { NSLog(@"open sqlite db ok."); } //创建数据库表 const char *createSql=" create table if not exists persons (id integer primary key autoincrement,name text)"; if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"create table ok."); }else { //如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样: NSLog(@"error: %s",errorMsg); sqlite3_free(errorMsg); } // 向表中插入记录 const char *insertSql="insert into persons (name) values(\"张三\")"; if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"insert ok."); }else { //如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样: NSLog(@"error: %s",errorMsg); sqlite3_free(errorMsg); } //结果集的查询,需要用到statement: const char *selectSql="select id,name from persons where name = ? "; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) { NSLog(@"select ok."); sqlite3_bind_text(statement, 1, "张三",-1,NULL); while (sqlite3_step(statement)==SQLITE_ROW) { int _id=sqlite3_column_int(statement, 0); NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; NSLog(@"row>>id %i, name %@",_id,name); } sqlite3_finalize(statement); } sqlite3_close(database); }
删除表操作
constchar *sql_drop_table="drop table if exists t";
constchar *sql_create_table="create table t(id int primary key,msg varchar(128))";
sqlite3_exec(db,sql_drop_table,0,0,&errmsg);
sqlite3_exec(db,sql_create_table,0,0,&errmsg);
插入数据
sqlite3_exec(db,"insert into t(id,msg) values(1,'Ady Liu')",NULL,NULL,&errmsg);
预编译操作
int i = 0;
sqlite3_stmt *stmt;
char ca[255];
//prepare statement
sqlite3_prepare_v2(db,"insert into t(id,msg) values(?,?)",-1,&stmt,0);
for(i=10;i<20;i++){
sprintf(ca,"HELLO#%i",i);
sqlite3_bind_int(stmt,1,i);
sqlite3_bind_text(stmt,2,ca,strlen(ca),NULL);
sqlite3_step(stmt);
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt)
预编译操作比较麻烦的,完整的预编译操作的流程是:
通过sqlite3_prepare_v2()创建一个sqlite3_stmt对象
通过sqlite3_bind_*()绑定预编译字段的值
通过sqlite3_step()执行SQL语句
通过sqlite3_reset()重置预编译语句,重复操作2多次
通过sqlite3_finalize()销毁资源
通过sqlite3_prepare_v2()创建一个sqlite3_stmt对象
通过sqlite3_bind_*()绑定预编译字段的值
通过sqlite3_step()执行SQL语句
通过sqlite3_reset()重置预编译语句,重复操作2多次
通过sqlite3_finalize()销毁资源
预编译SQL语句中可以包含如下几种形式:
?
?NNN
:VVV
@VVV
$VVV
NNN代表数字,VVV代表字符串。
?
?NNN
:VVV
@VVV
$VVV
NNN代表数字,VVV代表字符串。
如果是?或者?NNN,那么可以直接sqlite3_bind_*()进行操作,如果是字符串,还需要通过sqlite3_bind_parameter_index()获取对应的index,然后再调用sqlite3_bind_*()操作。这通常用于构造不定条件的SQL语句(动态SQL语句)。
查询操作
写道
回调函数的解释参考最上面的描述。 首先声明一个回调函数。
int print_record(void *,int,char **,char **);
查询代码
//select data
ret = sqlite3_exec(db,"select * from t",print_record,NULL,&errmsg);
if(ret != SQLITE_OK){
fprintf(stderr,"query SQL error: %s\n",errmsg);
}
现在定义回调函数,只是简单的输出字段值。
int print_record(void *params,int n_column,char **column_value,char **column_name){
int i;
for(i=0;i<n_column;i++){
printf("\t%s",column_value[i]);
}
printf("\n");
return 0;
}
int print_record(void *,int,char **,char **);
查询代码
//select data
ret = sqlite3_exec(db,"select * from t",print_record,NULL,&errmsg);
if(ret != SQLITE_OK){
fprintf(stderr,"query SQL error: %s\n",errmsg);
}
现在定义回调函数,只是简单的输出字段值。
int print_record(void *params,int n_column,char **column_value,char **column_name){
int i;
for(i=0;i<n_column;i++){
printf("\t%s",column_value[i]);
}
printf("\n");
return 0;
}
不使用回调的查询操作
写道
定义使用的变量
char **dbresult; int j,nrow,ncolumn,index;
查询操作
//select table
ret = sqlite3_get_table(db,"select * from t",&dbresult,&nrow,&ncolumn,&errmsg);
if(ret == SQLITE_OK){
printf("query %i records.\n",nrow);
index=ncolumn;
for(i=0;i<nrow;i++){
printf("[%2i]",i);
for(j=0;j<ncolumn;j++){
printf(" %s",dbresult[index]);
index++;
}
printf("\n");
}
}
sqlite3_free_table(dbresult);
char **dbresult; int j,nrow,ncolumn,index;
查询操作
//select table
ret = sqlite3_get_table(db,"select * from t",&dbresult,&nrow,&ncolumn,&errmsg);
if(ret == SQLITE_OK){
printf("query %i records.\n",nrow);
index=ncolumn;
for(i=0;i<nrow;i++){
printf("[%2i]",i);
for(j=0;j<ncolumn;j++){
printf(" %s",dbresult[index]);
index++;
}
printf("\n");
}
}
sqlite3_free_table(dbresult);
受影响的记录数
我们可以使用sqlite3_change(sqlite3 *)的API来统计上一次操作受影响的记录数。
ret = sqlite3_exec(db,"delete from t",NULL,NULL,&errmsg);
if(ret == SQLITE_OK){
printf("delete records: %i\n",sqlite3_changes(db));
}
ret = sqlite3_exec(db,"delete from t",NULL,NULL,&errmsg);
if(ret == SQLITE_OK){
printf("delete records: %i\n",sqlite3_changes(db));
}
总结
写道
这里我们接触了SQLITE3的13个API:
sqlite3_open()
sqlite3_exec()
sqlite3_close()
sqlite3_prepare_v2
sqlite3_bind_*()
sqlite3_bind_parameter_index()
sqlite3_step()
sqlite3_reset()
sqlite3_finalize()
sqlite3_get_table
sqlite3_change()
sqlite3_free()
sqlite3_free_table()
事实上截止到SQLITE3.7.14(2012/09/03) 一共提供了204个API函数(http://www.sqlite.org/c3ref/funclist.html)。
但最精简的API函数大概有6个:
sqlite3_open()
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()
核心API也就10个(在精简API基础上增加4个):
sqlite3_exec()
sqlite3_get_table()
sqlite3_reset()
sqlite3_bind()
因此掌握起来还是比较容易的。
sqlite3_open()
sqlite3_exec()
sqlite3_close()
sqlite3_prepare_v2
sqlite3_bind_*()
sqlite3_bind_parameter_index()
sqlite3_step()
sqlite3_reset()
sqlite3_finalize()
sqlite3_get_table
sqlite3_change()
sqlite3_free()
sqlite3_free_table()
事实上截止到SQLITE3.7.14(2012/09/03) 一共提供了204个API函数(http://www.sqlite.org/c3ref/funclist.html)。
但最精简的API函数大概有6个:
sqlite3_open()
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()
核心API也就10个(在精简API基础上增加4个):
sqlite3_exec()
sqlite3_get_table()
sqlite3_reset()
sqlite3_bind()
因此掌握起来还是比较容易的。
相关推荐
本文将深入探讨iOS中的几种主要数据持久化技术:Preference(偏好设置)、文件存储、归档、数据库(SQLite)以及Core Data的使用。 1. **Preference(偏好设置)** iOS中的偏好设置,通常被称为NSUserDefaults,是...
在iOS开发中,数据持久化是将应用程序中的数据保存到设备上以便在用户退出应用或设备重启后仍能访问的关键技术。本篇文章将详细介绍三种主要的数据持久化方法:SQLite(通过FMDB库)、Core Data以及Archiver(序列化...
SQLite支持SQL语言,可以在iOS应用中提供数据持久化的解决方案。 2. **FMDB库**:在iOS开发中,我们通常会使用FMDB库来操作SQLite,它是Objective-C的一个SQLite封装,提供了简单易用的接口,如执行SQL语句、查询...
8. **数据持久化**:由于SQLite是本地数据库,应用关闭后数据仍会保留,实现了数据的持久化存储。 9. **性能优化**:合理使用索引,避免全表扫描,以及适时地优化数据库结构,可以提高查询效率。 10. **错误处理**...
在iOS开发中,数据持久化是一项关键任务,它允许应用程序在退出或设备重启后仍然能够访问之前保存的数据。本文将详细介绍五种常见的iOS数据持久化方案:plist文件、偏好设置(Preference)、NSKeyedArchiver(归档)...
在iOS中,常见的数据持久化方式有SQLite数据库、Core Data框架、plist文件、JSON、XML以及归档与解档等。 二、SQLite数据库 SQLite是一个轻量级的关系型数据库,广泛应用于移动开发。它的优点包括:无需独立服务器...
iOS提供了多种数据持久化的方式,包括UserDefaults(用户默认设置)、Core Data(面向对象的数据库管理系统)、SQLite(关系型数据库)、文件系统以及云存储等。对于简单的数据,如用户偏好设置,可以使用...
在iOS开发中,数据库通常用于存储应用程序的数据,以便在用户之间持久化信息。SQLite是一个常见的选择,因为它轻量级、嵌入式且支持多种数据库操作。在这个“ios简单数据库封装”的主题中,我们将探讨如何面向对象地...
在iOS中,常见的数据持久化方式有SQLite数据库、Core Data、plist文件、归档以及JSON等。 2. JSON简介: JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...
在iOS中,常见的数据持久化方式有文件系统、SQLite数据库、Core Data以及归档/解档等。 SQLite是一种关系型数据库管理系统,因其轻量级、嵌入式和跨平台的特性,在移动应用开发中被广泛应用。TXSqliteSevice很可能...
1. **数据持久化**:将应用程序的数据保存到本地,即使应用程序关闭或设备重启,数据依然存在。 2. **数据管理**:通过SQL语句进行数据的添加、删除、修改和查询,方便对复杂数据结构的管理。 3. **离线应用支持**:...
iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefaults、SQLite3和Core Data NSUserDefaults官方文档介绍: NSUserDefaults类为和默认系统类交互提供了一种编程接口。默认系统允许应用程序去定制其行为...
在iOS开发中,数据持久化是至关重要的一个环节,它涉及到如何将应用程序中的数据长期存储在设备上,以便在后续的使用中能够快速恢复。"ios持久化保存数据"这个主题涵盖了几种主要的数据存储技术,包括UserDefaults、...
了解这些基础知识对于任何需要在iOS应用中持久化数据的开发者来说都是至关重要的。在实际项目中,你可能还需要考虑错误处理、事务管理以及性能优化等问题。通过提供的"数据库连接"压缩包文件,你可以找到更具体的...
"ios-FMDB持久化存储_Swift.zip" 文件包是一个关于如何使用Swift实现iOS应用数据持久化的教程,特别强调了使用FMDB库进行SQLite数据库操作。FMDB是Objective-C编写的SQLite封装库,但因其良好的Swift兼容性,也被...
iOS提供了多种持久化存储方法,包括UserDefaults、SQLite数据库、Core Data以及文件系统等。这里我们将深入探讨这些方法,并通过实例代码帮助新手理解其用法。 首先,UserDefaults是iOS中最简单的持久化存储方式,...
在iOS开发中,数据持久化是一项至关重要的技术,它使得应用程序的数据可以在用户关闭应用或设备重启后仍然保留。本文将通过三个具体的实例深入探讨iPhone上实现数据持久化的三种方法:属性列表、对象归档和SQLite3...
这会将变更同步到持久化存储协调器,进而更新SQLite数据库。 3. 查询数据:利用NSFetchRequest和NSSortDescriptor进行查询和排序。还可以使用NSPredicate进行复杂的条件过滤。 4. 更新和删除:直接修改对象的属性...
### iOS数据库的使用介绍 #### 一、SQLite数据库概述 SQLite是一种轻量级的关系型数据库管理系统,被广泛应用于各种移动设备中,特别是iOS平台上。它以其极低的资源占用率和出色的性能表现,在嵌入式系统领域享有...
在iOS应用开发中,数据库是存储和管理数据的关键组件,特别是在需要持久化用户数据或进行离线处理的情况下。本教程将深入探讨如何在iOS中使用SQLite数据库来实现基本的增删改查(CRUD)操作。 SQLite是一款轻量级、...