深度解析iPhone開發(fā)之數(shù)據(jù)持久化
iphone在開發(fā)應(yīng)用程序的時候,當然需要經(jīng)常的實用數(shù)據(jù)庫進行數(shù)據(jù)的保存了,在移動設(shè)備上,我們可以使用文件,數(shù)據(jù)庫等方式去保存,為了能夠讓用戶無法使用其他的程序去修改,我這里認為使用數(shù)據(jù)庫的方式是一個很好的方式。在iPhone上面,我們可以使用SQLite進行數(shù)據(jù)的持久化。另外值得一提的是Firefox是使用數(shù)據(jù)庫的方式保存的,同樣也是SQLite。
在iPhone開發(fā)重,我們需要首先添加一個SQLite的庫,XCode本身就支持的,我們在左邊的Frameworks里面選擇Add,然后選擇Existing Frameworks,在彈出窗口中選擇SQLite的庫libsqlite3.0.dylib。
添加之后,我們就可以使用SQLite在iPhone中進行數(shù)據(jù)的保存,查詢,刪除等操作了。
現(xiàn)在我們可以寫一個SQLite的Helper文件,方便我們在其他的代碼中使用,頭文件(SqliteHelper.h)如下。
- #import <Foundation/Foundation.h>
 - #import “sqlite3.h“
 - #define kFileName @”mydatabase.sql”
 - @interface SqliteHelper : NSObject {
 - sqlite3 *database;
 - }
 - //創(chuàng)建表
 - - (BOOL)createTable;
 - //插入數(shù)據(jù)
 - (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password;
 - //查詢表
 - (BOOL)checkIfHasUser;
 - @end
 
我們的代碼文件如下。
- #import “SqliteHelper.h“
 - @implementation SqliteHelper
 - (BOOL)createTable
 - {
 - NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 - NSString *paths = [[path objectAtIndex:0] stringByAppendingPathComponent:kFileName];
 - NSFileManager *fileManager = [NSFileManager defaultManager];
 - BOOL fileFinded = [fileManager fileExistsAtPath:paths];
 - NSLog(@”Database file path is %@“,paths);
 - if(fileFinded)
 - {
 - NSLog(@”Database file existed“);
 - if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)
 - {
 - sqlite3_close(database);
 - NSLog(@”Open Failed“);
 - return NO;
 - }
 - }else{
 - NSLog(@”Database file is not existed“);
 - if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)
 - {
 - sqlite3_close(database);
 - NSLog(@”Open Failed“);
 - return NO;
 - }
 - }
 - char *errorMsg;
 - NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text)“;
 - if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
 - {
 - sqlite3_close(database);
 - NSLog(@”Open failed or init filed“);
 - return NO;
 - }
 - return YES;
 - }
 - (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password
 - {
 - char *errorMsg;
 - NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text)“;
 - if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
 - {
 - sqlite3_close(database);
 - NSLog(@”Open failed or init filed“);
 - return NO;
 - }
 - NSString *insertData = [[NSString alloc] initWithFormat:@”insert or replace into fields
 - (userid,username,password) values (%d,’%@’,'%@’)“,0,username,password];
 - if(sqlite3_exec(database,[insertData UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
 - {
 - sqlite3_close(database);
 - NSLog(@”Open failed or failed to insert“);
 - return NO;
 - }
 - return YES;
 - }
 - (BOOL)checkIfHasUser
 - {
 - NSString *getUserCountSQL = @”select * from fields“;
 - sqlite3_stmt *statement;
 - NSLog(@”checkIfHasUser“);
 - if(sqlite3_prepare_v2(database,[getUserCountSQL UTF8String],-1,&statement,nil)==SQLITE_OK)
 - {
 - //while(sqlite3_step(statement) == SQLITE_ROW)
 - //{
 - // int row = sqlite3_column_int(statement,0);
 - // char* rowData = (char*)sqlite3_column_text(statement,2);
 - // NSString *fieldName = [[NSString alloc] initWithFormat:@”show%d”,row];
 - // NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
 - //
 - // NSLog(@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue);
 - // return [[NSString alloc] initWithFormat:@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue];
 - //
 - // [fieldName release];
 - // [fieldValue release];
 - //}
 - //sqlite3_finalize(statement);
 - if(sqlite3_step(statement) == SQLITE_ROW)
 - {
 - NSLog(@”Have user“);
 - return YES;
 - }
 - }
 - NSLog(@”No user“);
 - return NO;
 - }
 - @end
 
其中checkIfHasUser是檢查數(shù)據(jù),這個方法中我注釋的是得到數(shù)據(jù),因為我們這里只是check,所以不需要得到數(shù)據(jù),直接看是否存在數(shù)據(jù)即可。上面的代碼雖然沒有過多的注釋,但是代碼本身已經(jīng)很簡單了,上下文也非常清楚,所以我就不寫過多的注釋了。
【編輯推薦】
非結(jié)構(gòu)化數(shù)據(jù)庫與異構(gòu)數(shù)據(jù)庫區(qū)別















 
 
 



 
 
 
 