1. 程式人生 > >iOS儲存資料的4種方式

iOS儲存資料的4種方式

在iOS開發過程中,不管是做什麼應用,都會碰到資料儲存的問題。將資料儲存到本地,能夠讓程式的執行更加流暢,不會出現讓人厭惡的菊花形狀,使得使用者體驗更好。下面介紹一下資料儲存的方式:

1.NSKeyedArchiver:採用歸檔的形式來儲存資料,該資料物件需要遵守NSCoding協議,並且該物件對應的類必須提供encodeWithCoder:和initWithCoder:方法。前一個方法告訴系統怎麼對物件進行編碼,而後一個方法則是告訴系統怎麼對物件進行解碼。例如對Possession物件歸檔儲存。

定義Possession:

@interface Possession:NSObject<NSCoding>{//遵守NSCoding協議

       NSString *name;//待歸檔型別

}

@implementation Possession

-(void)encodeWithCoder:(NSCoder *)aCoder{

            [aCoder encodeObject:name forKey:@"name"];

}

-(void)initWithCoder:(NSCoder *)aDecoder{

            name=[[aDeCoder decodeObjectforKey:@"name"] retain];

}

歸檔操作:

如果對Possession物件allPossession歸檔儲存,只需要NSCoder子類NSKeyedArchiver的方法archiveRootObject:toFile: 即可。

NSString *path = [self possessionArchivePath];

[NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]

解壓操作:

同樣呼叫NSCoder子類NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可  

allPossessions = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] retain];

缺點:歸檔的形式來儲存資料,只能一次性歸檔儲存以及一次性解壓。所以只能針對小量資料,而且對資料操作比較笨拙,即如果想改動資料的某一小部分,還是需要解壓整個資料或者歸檔整個資料。

2.NSUserDefaults:用來儲存應用程式設定和屬性、使用者儲存的資料。使用者再次開啟程式或開機後這些資料仍然存在。NSUserDefaults可以儲存的資料型別包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要儲存其他型別,則需要轉換為前面的型別,才能用NSUserDefaults儲存。具體實現為:

儲存資料:

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name [email protected]”default string“;
[defaults setObject:firstName forKey:@"name"];
  //獲得UIImage例項

UIImage *image=[[UIImage alloc]initWithContentsOfFile:@"photo.jpg"];

NSData *imageData = UIImageJPEGRepresentation(image, 100);//UIImage物件轉換成NSData

[defaults synchronize];//用synchronize方法把資料持久化到standardUserDefaults資料庫

讀取資料

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name = [defaults objectForKey:@"name"];//根據鍵值取出name
NSData *imageData = [defaults dataForKey:@"image"];
UIImage *Image = [UIImage imageWithData:imageData];//NSData轉換為UIImage

3. Write寫入方式:永久儲存在磁碟中。具體方法為:

第一步:獲得檔案即將儲存的路徑:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask,YES);//使用C函式NSSearchPathForDirectoriesInDomains來獲得沙盒中目錄的全路徑。該函式有三個引數,目錄型別、he domain mask、布林值。其中布林值表示是否需要通過~擴充套件路徑。而且第一個引數是不變的,即為NSSearchPathDirectory 。在IOS中後兩個引數也是不變的,即為:NSUserDomainMask 和 YES。
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];

還有一種方法是使用NSHomeDirectory函式獲得sandbox的路徑。具體的用法為:

NSString *sandboxPath = NSHomeDirectory();
// Once you have the full sandbox path, you can create a path from it,但是不能在sandbox的本檔案層上寫檔案也不能建立目錄,而應該是此基礎上建立一個新的可寫的目錄,例如Documents,Library或者temp。
NSString *documentPath = [sandboxPath
            stringByAppendingPathComponent:@"Documents"];//將Documents新增到sandbox路徑上,具體原因前面分析了!

這兩者的區別就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory後面新增Document更加安全。因為該檔案目錄可能在未來發送的系統上發生改變。

第二步:生成在該路徑下的檔案:

NSString *FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是儲存檔案的檔名

第三步:往檔案中寫入資料:

[data writeToFile:FileName atomically:YES];//將NSData型別物件data寫入檔案,檔名為FileName

最後:從檔案中讀出資料:

NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];//從FileName中讀取出資料
4. SQLite:採用SQLite資料庫來儲存資料。SQLite作為一中小型資料庫,應用ios中,跟前三種儲存方式相比,相對比較複雜一些。還是一步步來吧!

第一步:需要新增SQLite相關的庫以及標頭檔案:在專案檔案的Build Phases下,找到Link Binary Library(ies),新增libsqlite3.0.dyliblibsqlite3.dylib與前者的區別暫時不知,兩者應該差不多);在專案檔案中標頭檔案或者原始檔中新增標頭檔案#import "/usr/include/sqlite3.h"

第二步:開始使用SQLite:

NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask , YES);
NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"];
//上面兩句已經比較熟悉了吧! 
//開啟資料庫
if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) { 
        NSLog(@"sqlite dadabase is opened."); 
}
else{ return;}//開啟不成功就返回

在打開了資料庫的前提下,如果資料庫沒有表,那就開始建表了哦!
char *error; 
const char *createSql="create table(id integer primary key autoincrement, name text)";
if (sqlite3_exec(database, createSql, NULL, NULL, &error)==SQLITE_OK) { 
        NSLog(@"create table is ok."); 
}
else
{
       NSLog(@"error: %s",error);
       sqlite3_free(error);//每次使用完畢清空error字串,提供給下一次使用

建表完成之後,就開始插入記錄:


const char *insertSql="insert into a person (name) values(‘gg’)"; 
if (sqlite3_exec(database, insertSql, NULL, NULL, &error)==SQLITE_OK) { 
        NSLog(@"insert operation is ok."); 
}

else
{
       NSLog(@"error: %s",error);
       sqlite3_free(error);//每次使用完畢清空error字串,提供給下一次使用

下一步,查詢記錄:

const char *selectSql="select id,name from a person"; 
sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(database,selectSql, -1, &statement, nil)==SQLITE_OK) { 
        NSLog(@"select operation is ok."); 
}
else
{
       NSLog(@"error: %s",error);
       sqlite3_free(error);

while(sqlite3_step(statement)==SQLITE_ROW) { 
int _id=sqlite3_column_int(statement, 0); 
NSString *name=(char*)sqlite3_column_text(statement, 1); 
NSLog(@"row>>id %i, name %s",_id,name); 
}
sqlite3_finalize(statement);

最後,關閉資料庫:

sqlite3_close(database); 

注意:寫入資料庫,字串可以採用char方式,而從資料庫中取出char型別,當char型別有表示中文字元時,會出現亂碼。這是因為資料庫預設使用ascII編碼方式。所以要想正確從資料庫中取出中文,需要用NSString來接收從資料庫取出的字串。

相關推薦

iOS儲存的幾方式

1.寫檔案 NSData *dat = [[NSDataalloc]initWithContentsOfURL:[NSURLURLWithString:imageUrl]]; NSString *fullPath = [[NSHomeDirectory() strin

iOS儲存資料4方式

在iOS開發過程中,不管是做什麼應用,都會碰到資料儲存的問題。將資料儲存到本地,能夠讓程式的執行更加流暢,不會出現讓人厭惡的菊花形狀,使得使用者體驗更好。下面介紹一下資料儲存的方式: 1.NSKeyedArchiver:採用歸檔的形式來儲存資料,該資料物件需要遵守NSCo

iOS 儲存資料4方式

在iOS開發過程中,不管是做什麼應用,都會碰到資料儲存的問題。將資料儲存到本地,能夠讓程式的執行更加流暢,不會出現讓人厭惡的菊花形狀,使得使用者體驗更好。下面介紹一下資料儲存的方式: 1.NSKeyedArchiver:採用歸檔的形式來儲存資料,該資料物件需要遵守NSCod

iOS 資料儲存的幾方式

在iOS開發過程中常用的本地化儲存有五種方式: 1.plist (XML屬性列表歸檔 NSArray\NSDictionary) 2.preference (偏好設定\NSUserDefaults) (本質還是通過plist來儲存資料,但是使用更加簡單,無需關注檔案、資料夾

springmvc接收json資料4方式

ajax我經常用到,傳的資料是json資料,json資料又有物件,陣列。所有總結下springmvc獲取前端傳來的json資料方式: 1、以RequestParam接收 前端傳來的是json資料不多時:[id:id],可以直接用@RequestParam來獲取值 @Autowired p

iOS 開發之 pdf 文件的載入與瀏覽的 4 方式

前言 在我們的開發中,有些像電子書型別的app的開發會涉及到pdf文件的載入與展示。由於筆者專案中正好涉及到這塊,於是將pdf常用的幾種載入方式做個總結。以供後面可能用到的同學做個參考。 正文 通常我們用到的pdf文件的載入方式有4種: UIWebView載入本地或者

iOS 不支援多繼承,實現多繼承的4方式

classA 實現了methodA  方法  classB 實現了 methodB 方法   classC 要同時實現methodA和methodB方法 在C++ 中用多繼承就能實現,但是Objective c 不支援多重繼承,那如何實現。 方法1. 組合方式,用Class

資料撼動供應鏈系統的4方式

大資料越來越流行,我們不能視而不見,因為有充足的理由:它改變了很多企業的運營方式,而且會繼續下去,特別是在供應鏈上。據SCM World的報道,64%的供應鏈管理人員認為大資料分析是一項顛覆性的重要技術,儘管其技術應用仍然相對較新。Syracuse大學資訊研究學院副教授Jef

android 資料儲存的幾方式

總體的來講,資料儲存方式有三種:一個是檔案,一個是資料庫,另一個則是網路。其中檔案和資料庫可能用的稍多一些,檔案用起來較為方便,程式可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量資料時效能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平臺等等;網路

《Cocos2d學習之路》九、資料儲存的幾方式和基本使用

年前已經把這部分東西學完了,但是後面出現了一個bug,緊接著公司組織關係變更,搬家到新的地方上班等事情,忙完接著就回家過年了。終於,年後開始上班了,抽出空來把blog寫一下。 cocos2dx中資料儲存的幾種方式 1、userdefault 這個類似於android中

Android使用者登入資料儲存的三方式

登入的頁面: 佈局程式碼: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.co

提交表單的4方式

demo1 doc type function pat 相對 dem location cti 1,超鏈接 <!-- 鏈接到page2 --> <a href="page2.jsp">鏈接到page2</a><br> <

sqoop提供數據庫密碼的4方式

d參數 指定 裏的 路徑 定時 cdh5 als http 並不會 背景 sqoop是一個用來將Hadoop和關系型數據庫(RDBMS)中的數據進行相互轉移的工具。在使用sqoop時,我們需要提供數據庫的訪問密碼。目前sqoop共支持4種輸入密碼的方式: 明文模式。 交互

Docker容器進入的4方式

docker容器進入的4種方式在使用Docker創建了容器之後,大家比較關心的就是如何進入該容器了,其實進入Docker容器有好幾多種方式,這裏我們就講一下常用的幾種進入Docker容器的方法。進入Docker容器比較常見的幾種做法如下:使用docker attach使用SSH使用nsenter使用exec一

java復制文件的4方式

date family gpo exceptio 處理 nio use 效率 read 一、使用FileStreams復制 這是最經典的方式將一個文件的內容復制到另一個文件中。 使用FileInputStream讀取文件A的字節,使用FileOutputStream寫入到文

java web前端發送請求的4方式

adduser nbsp NPU ajax class servle 表單提交 參數 user 表單 action, 鏈接href,js 綁定按鈕 ajax綁定標簽 <h1>通過表單提交參數</h1> <form acti

進入正在執行的Docker容器的4方式

在使用Docker建立了容器之後,如何進入該容器呢? 進入Docker容器比較常見的幾種做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一、使用docker attach進入Docker容器 Docker提供了attach命令來進入D

反射---獲取Class類的4方式

1.呼叫執行時類本身的.class屬性 Class clazz = String.class; 2,通過執行時類的物件獲取 Person p = new Person(); Class clazz = p.getClass(); 3.通過Class的靜態方法獲取:體現反射的動態性

mysql中like語法拼接4方式

在mysql中,字串與字串之間用空格連線相當於拼接,'a' 'b' 'c' 相當於 'abc' 'a'"b"'c'雖然沒用空格,但由於是不同的字串型別,故也相當於拼接後的'abc'或"abc"  在mysql中,like語法本身為: like  '%str%' 解析:like與

建立多執行緒的4方式

1.執行緒是什麼?         執行緒被稱為輕量級程序,是程式執行的最小單位,它是指在程式執行過程中,能夠執行程式碼的一個執行單位。每個程式程式都至少有一個執行緒,也即是程式本身。 2.執行緒狀態         Jav