深度解析iPhone开发之数据持久化
创始人
2024-07-31 04:31:04
0

iphone在开发应用程序的时候,当然需要经常的实用数据库进行数据的保存了,在移动设备上,我们可以使用文件,数据库等方式去保存,为了能够让用户无法使用其他的程序去修改,我这里认为使用数据库的方式是一个很好的方式。在iPhone上面,我们可以使用SQLite进行数据的持久化。另外值得一提的是Firefox是使用数据库的方式保存的,同样也是SQLite。

在iPhone开发重,我们需要首先添加一个SQLite的库,XCode本身就支持的,我们在左边的Frameworks里面选择Add,然后选择Existing Frameworks,在弹出窗口中选择SQLite的库libsqlite3.0.dylib。

添加之后,我们就可以使用SQLite在iPhone中进行数据的保存,查询,删除等操作了。

现在我们可以写一个SQLite的Helper文件,方便我们在其他的代码中使用,头文件(SqliteHelper.h)如下。

  1. #import  
  2. #import “sqlite3.h“  
  3. #define kFileName @”mydatabase.sql”    
  4. @interface SqliteHelper : NSObject {  
  5. sqlite3 *database;   
  6. }  
  7. //创建表  
  8. - (BOOL)createTable;  
  9. //插入数据  
  10. (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password;  
  11. //查询表  
  12. (BOOL)checkIfHasUser;   
  13. @end 

我们的代码文件如下。

  1. #import “SqliteHelper.h“   
  2. @implementation SqliteHelper  
  3. (BOOL)createTable  
  4. {  
  5. NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  6. NSString *paths = [[path objectAtIndex:0] stringByAppendingPathComponent:kFileName];  
  7. NSFileManager *fileManager = [NSFileManager defaultManager];  
  8. BOOL fileFinded = [fileManager fileExistsAtPath:paths];  
  9. NSLog(@”Database file path is %@“,paths);  
  10. if(fileFinded)  
  11. {  
  12.    NSLog(@”Database file existed“);  
  13. if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)  
  14. {  
  15.    sqlite3_close(database);  
  16.    NSLog(@”Open Failed“);  
  17.    return NO;  
  18.   }  
  19. }else{  
  20.     NSLog(@”Database file is not existed“);  
  21. if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)  
  22. {  
  23.    sqlite3_close(database);  
  24.    NSLog(@”Open Failed“);  
  25.    return NO;  
  26.   }  
  27. }  
  28. char *errorMsg;  
  29. NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text)“;  
  30. if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)  
  31. {  
  32.    sqlite3_close(database);  
  33.    NSLog(@”Open failed or init filed“);  
  34.    return NO;  
  35. }  
  36.    return YES;  
  37. }  
  38. (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password  
  39. {  
  40.    char *errorMsg;  
  41.     NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text)“;  
  42.    if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)  
  43. {  
  44.    sqlite3_close(database);  
  45.    NSLog(@”Open failed or init filed“);  
  46.    return NO;  
  47. }  
  48. NSString *insertData = [[NSString alloc] initWithFormat:@”insert or replace into fields 
  49. (userid,username,password) values (%d,’%@’,'%@’)“,0,username,password];  
  50. if(sqlite3_exec(database,[insertData UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)  
  51. {  
  52.    sqlite3_close(database);  
  53.    NSLog(@”Open failed or failed to insert“);  
  54.    return NO;  
  55. }  
  56.    return YES;  
  57. }  
  58. (BOOL)checkIfHasUser  
  59. {  
  60.    NSString *getUserCountSQL = @”select * from fields“;  
  61.    sqlite3_stmt *statement;  
  62.    NSLog(@”checkIfHasUser“);  
  63. if(sqlite3_prepare_v2(database,[getUserCountSQL UTF8String],-1,&statement,nil)==SQLITE_OK)  
  64. {  
  65. //while(sqlite3_step(statement) == SQLITE_ROW)  
  66. //{  
  67. // int row = sqlite3_column_int(statement,0);  
  68. // char* rowData = (char*)sqlite3_column_text(statement,2);  
  69. // NSString *fieldName = [[NSString alloc] initWithFormat:@”show%d”,row];  
  70. // NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];  
  71. //  
  72. // NSLog(@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue);  
  73. // return [[NSString alloc] initWithFormat:@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue];  
  74. //  
  75. // [fieldName release];  
  76. // [fieldValue release];  
  77. //}  
  78. //sqlite3_finalize(statement);  
  79. if(sqlite3_step(statement) == SQLITE_ROW)  
  80. {  
  81. NSLog(@”Have user“);  
  82. return YES;  
  83. }  
  84. }  
  85. NSLog(@”No user“);  
  86. return NO;  
  87. }  
  88. @end 

其中checkIfHasUser是检查数据,这个方法中我注释的是得到数据,因为我们这里只是check,所以不需要得到数据,直接看是否存在数据即可。上面的代码虽然没有过多的注释,但是代码本身已经很简单了,上下文也非常清楚,所以我就不写过多的注释了。

【编辑推荐】

解析iphone多线程

智能数据仓库的设计方法

非结构化数据库与异构数据库区别

让数据库飞起来 10大DB2优化技巧

WWDC传闻分析:神秘的iPhone 4S以及iOS 5

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...