Java代码

  1. -(void) addObserver{
  2. //当程序进入后台时执行操作
  3. UIApplication *app = [UIApplication sharedApplication];
  4. [[ NSNotificationCenter defaultCenter] addObserver: self
  5. selector:@selector(appwillresignActive) name:UIApplicationWillResignActiveNotification object:app];
  6. }
  7. -(void) appwillresignActive{
  8. NSLog(@"监听测试");
  9. }

-(void) addObserver{

//当程序进入后台时执行操作

UIApplication *app = [UIApplication sharedApplication];

[[ NSNotificationCenter defaultCenter] addObserver: self

selector:@selector(appwillresignActive) name:UIApplicationWillResignActiveNotification object:app];

}

-(void) appwillresignActive{

NSLog(@"监听测试");

}

头部引入

Java代码

  1. #import "sqlite3.h"

#import "sqlite3.h"

Java代码

  1. -(void) makeDBinfo{
  2. NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  3. NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"];
  4. char *errorMsg;
  5. //打开或创建数据库
  6. sqlite3 *database;
  7. if (sqlite3_open([databaseFilePath UTF8String], &database)!=SQLITE_OK) {
  8. sqlite3_close(database);
  9. }else {
  10. NSLog(@"open sqlite db ok.");
  11. }
  12. //创建数据库表
  13. const char *createSql=" create table if not exists persons (id integer primary key autoincrement,name text)";
  14. if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK)
  15. {
  16. NSLog(@"create table ok.");
  17. }else
  18. {
  19. //如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:
  20. NSLog(@"error: %s",errorMsg);
  21. sqlite3_free(errorMsg);
  22. }
  23. // 向表中插入记录
  24. const char *insertSql="insert into persons (name) values(\"张三\")";
  25. if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK)
  26. {
  27. NSLog(@"insert ok.");
  28. }else
  29. {
  30. //如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:
  31. NSLog(@"error: %s",errorMsg);
  32. sqlite3_free(errorMsg);
  33. }
  34. //结果集的查询,需要用到statement:
  35. const char *selectSql="select id,name from persons where name = ? ";
  36. sqlite3_stmt *statement;
  37. if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) {
  38. NSLog(@"select ok.");
  39. sqlite3_bind_text(statement, 1, "张三",-1,NULL);
  40. while (sqlite3_step(statement)==SQLITE_ROW) {
  41. int _id=sqlite3_column_int(statement, 0);
  42. NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];
  43. NSLog(@"row>>id %i, name %@",_id,name);
  44. }
  45. sqlite3_finalize(statement);
  46. }
  47. sqlite3_close(database);
  48. }

-(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()销毁资源

预编译SQL语句中可以包含如下几种形式:
?
?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;
}

不使用回调的查询操作

写道

定义使用的变量
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));

}

总结

写道

这里我们接触了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()
因此掌握起来还是比较容易的。

iOS 数据库持久化的更多相关文章

  1. iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)

    本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...

  2. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  3. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

  4. IOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...

  5. iOS数据库操作之coredata详细操作步骤

    CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...

  6. iOS数据持久化方式及class_copyIvarList与class_copyPropertyList的区别

    iOS数据持久化方式:plist文件(属性列表)preference(偏好设置)NSKeyedArchiver(归档)SQLite3CoreData沙盒:iOS程序默认情况下只能访问自己的程序目录,这 ...

  7. iOS 数据库操作(使用FMDB)

    iOS 数据库操作(使用FMDB)   iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

  8. android数据库持久化框架

    android数据库持久化框架

  9. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...

随机推荐

  1. ASPXGridView用法

    一.ASPXGridView外观显示 属性: Caption----列的标题( KeyFieldName----数据库字段 SEOFriendly 是否启用搜索引擎优化 Summary 指定分页汇总信 ...

  2. Track files and folders manipulation in Windows

    The scenario is about Business Secret and our client do worry about data leakage. They want to know ...

  3. GET POST 区别详解

    Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据. 2. Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而 ...

  4. Android IOS WebRTC 音视频开发总结(四五)-- ORTC背后的真相

    本文主要介绍ORTC(Object Real-time Communication),支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. - ...

  5. javaSE第二十三天

    第二十三天    338 1.进程和线程的概述    338 2.多线程(理解)    339 (1)多线程:一个应用程序有多条执行路径    339 (2)Java程序的运行原理及JVM的启动是多线 ...

  6. ADO.NET中的DataReader详解

    使用特性 原理图 PS:Read()使指针下移,同时销毁上一条.所以SqlDataReader是只进的. GetValue()是找当前行中的列 SqlDataReader()特性. 1)只进的  上面 ...

  7. 在CentOS下安装WebBench进行web 性能测试

    Webbench是有名的网站压力测试工具 编译安装:1. wget http://www.sfr-fresh.com/unix/privat/webbench-1.5.tar.gz2. tar zxv ...

  8. POJ C++程序设计 编程题#1 编程作业—文件操作与模板

    编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 实现一个三维数组 ...

  9. [译]MongoDB 3.0发布说明

    原文来自:http://docs.mongodb.org/manual/release-notes/3.0/ 2015年3月3日 MongoDB 3.0现已可供使用.关键新特性包括支持WiredTig ...

  10. Linux命令行修改IP、网关、DNS的方法

    Linux中在命令行中修改IP地址.网关.DNS的方法. 网卡eth0    IP修改为 102.168.0.1 复制代码代码如下: ifconfig eth0 102.168.0.1 netmask ...