iOS資料存放區的幾種方式,ios資料存放區幾種
iOS的資料存放區是iOS應用開發的重要知識點:
關於這方面知識,網上有很多介紹,但對於代碼層次的使用方式並未有系統全面介紹。此文章針對iOS稍熟悉的童鞋,需要對CoreData的原理有一定的瞭解。目前儲存方式大概有以下幾種:
UT代碼確保使用方式正確。請閱讀以下內容:
#import <XCTest/XCTest.h>#import <sqlite3.h>#import "CoreDataHelper.h"@interface StudyUITests : XCTestCase@end@implementation StudyUITests- (void)setUp{ [super setUp];}- (void)tearDown{ [super tearDown];}-(void)testCoreData{ CoreDataHelper *coreHelper = [[CoreDataHelper alloc] init]; [coreHelper coreDataTest];}-(void)testSqlite3{ sqlite3 *db; NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *databasePath = [documentPath stringByAppendingPathComponent:@"test.sqlite"]; NSLog(@"db path: %@",databasePath); if(sqlite3_open([databasePath UTF8String], &db) != SQLITE_OK){ sqlite3_close(db); NSLog(@"open sqlite fail!"); NSAssert(FALSE, @"create sqlite error"); } NSString *sqlCreateTable = @"CREATE TABLE IF NOT EXISTS ptable (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)"; char *error; if(sqlite3_exec(db, [sqlCreateTable UTF8String], NULL, NULL, &error) != SQLITE_OK){ sqlite3_close(db); NSLog(@"can not create table."); NSAssert(FALSE, @"create table error"); } NSString *deleteAllSql = @"delete from ptable"; if(sqlite3_exec(db, [deleteAllSql UTF8String], NULL, NULL, &error) != SQLITE_OK){ sqlite3_close(db); NSLog(@"delete values from table"); NSAssert(FALSE, @"delete values from table"); } NSString *sql1 = [NSString stringWithFormat: @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')", @"ptable", @"name", @"age", @"address", @"first name", @"23", @"pukou"]; NSString *sql2 = [NSString stringWithFormat: @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')", @"ptable", @"name", @"age", @"address",@"second name", @"20", @"qixia"]; if(sqlite3_exec(db, [sql1 UTF8String], NULL, NULL, &error) != SQLITE_OK){ sqlite3_close(db); NSLog(@"can not insert sql1"); NSAssert(FALSE, @"create insert db (sql1) error"); } if(sqlite3_exec(db, [sql2 UTF8String], NULL, NULL, &error) != SQLITE_OK){ sqlite3_close(db); NSLog(@"can not insert sql2"); NSAssert(FALSE, @"create insert db (sql2) error"); } //Read data and check result. NSString *query = @"select * from ptable"; sqlite3_stmt *statement; if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil) == SQLITE_OK){ //start to traverse data int size = 0; while (sqlite3_step(statement) == SQLITE_ROW) { size++; char *name = (char*)sqlite3_column_text(statement, 1); int age= (int)sqlite3_column_int(statement, 2); char *address = (char*)sqlite3_column_text(statement, 3); NSString *nameStr = [[NSString alloc] initWithUTF8String:name]; NSString *addressStr = [[NSString alloc] initWithUTF8String:address]; NSLog(@"name: %@ age: %d address: %@",nameStr,age,addressStr); } NSAssert(size == 2, @"size should 2"); }else{ NSAssert(FALSE, @"query db error"); } sqlite3_close(db);}-(void)testWriteToFile{ NSString *st1 = @"first"; NSString *st2 = @"second"; NSArray *array = [NSArray arrayWithObjects:st1,st2, nil]; NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSAssert(path != nil, @"path is nil"); NSString *filename = [path stringByAppendingPathComponent:@"test.data"]; NSAssert([array writeToFile:filename atomically:YES],@"write successfully"); NSMutableArray *savearray = [NSMutableArray arrayWithContentsOfFile:filename]; NSAssert([[savearray objectAtIndex:0] isEqualToString:st1], @"not equal to str1"); NSAssert([[savearray objectAtIndex:1] isEqualToString:st2], @"not equal to str2"); }-(void)testUserDefault{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *name = @"test"; [defaults setObject:name forKey:@"name"]; UIImage *image = [UIImage imageNamed:@"photo"]; NSData *imageData = UIImagePNGRepresentation(image); [defaults setObject:imageData forKey:@"image"]; //now read from data NSString *name1= [defaults objectForKey:@"name"]; NSData *imageData1 = [defaults objectForKey:@"image"]; NSAssert([name1 isEqualToString:name], @"name1 is equal to test"); NSAssert([imageData1 isEqualToData:imageData], @"image data is not equal"); }-(void)testKeyedArchiver{ NSString *save1 =@"test1"; NSString *save2 =@"test2"; NSArray *array = [NSArray arrayWithObjects:save1, save2, nil]; NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filename = [path stringByAppendingPathComponent:@"savedatatest"]; NSLog(@"filename : %@",filename); //save data NSAssert([NSKeyedArchiver archiveRootObject:array toFile:filename],@"archive successfully."); array = [NSKeyedUnarchiver unarchiveObjectWithFile:filename]; save1 = [array objectAtIndex:0]; NSAssert([save1 isEqualToString:@"test1"], @"save1 must equals to test1"); save2 = [array objectAtIndex:1]; NSAssert([save2 isEqualToString:@"test2"], @"save1 must equals to test2"); }@end
CoreData的使用稍微複雜一些,所以將其單獨放入Helper類中。Entity model包含name,age 和 address 三個屬性。可在測試工程建立,並產生Entity對象。
#import "CoreDataHelper.h"#import <CoreData/CoreData.h>#import "Entity.h"@interface CoreDataHelper()@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;-(NSPersistentStoreCoordinator *)persistentStoreCoordinator;-(NSManagedObjectContext *)managedObjectContext;-(NSManagedObjectModel *)managedObjectModel;@end@implementation CoreDataHelper-(void)coreDataTest{ NSError *error = nil; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; NSArray *oldResult = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; for (Entity *bb in oldResult) { [self.managedObjectContext deleteObject:bb]; } NSAssert([self.managedObjectContext save:&error], @"deleting....."); /******insert *****/ Entity *entity = [[Entity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; entity.name = @"test"; entity.age = [NSNumber numberWithInt:20]; entity.address = @"beijing"; [self.managedObjectContext insertObject:entity]; NSAssert([self.managedObjectContext save:&error], @"inserting....."); /*****query *****/ NSSortDescriptor *sortDescription = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO]; NSArray *sortDescriptions = [[NSArray alloc] initWithObjects:sortDescription, nil]; [request setSortDescriptors:sortDescriptions]; NSMutableArray *array = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; for (Entity *bb in array) { NSLog(@"name: %@ age:%@ address:%@",bb.name,bb.age,bb.address); } NSAssert([array count] == 1, @"count size is equal to 1"); /***** update and check****/ NSArray *updateResult = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; Entity *first = [updateResult objectAtIndex:0]; first.name = @"one"; NSAssert([self.managedObjectContext save:&error], @"updating....."); updateResult = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; first = [updateResult objectAtIndex:0]; NSAssert([first.name isEqualToString:@"one"], @"need to equeal one"); /**** insert and check ****/ entity = [[Entity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; entity.name = @"test2"; entity.age = [NSNumber numberWithInt:23]; entity.address = @"nanjing"; [self.managedObjectContext insertObject:entity]; NSAssert([self.managedObjectContext save:&error], @"inserting....."); array = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; for (Entity *bb in array) { NSLog(@"name: %@ age:%@ address:%@",bb.name,bb.age,bb.address); } NSAssert([array count] == 2, @"now size is equal to 2"); }-(NSPersistentStoreCoordinator *)persistentStoreCoordinator{ if(_persistentStoreCoordinator) return _persistentStoreCoordinator; NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:@"person.sqlite"]]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){ NSLog(@"persistent error : %@",[error userInfo]); } return _persistentStoreCoordinator;}-(NSManagedObjectContext *)managedObjectContext{ if(_managedObjectContext) return _managedObjectContext; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if(coordinator){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext;}-(NSManagedObjectModel *)managedObjectModel{ if(_managedObjectModel) return _managedObjectModel; NSURL *modeUrl = [[NSBundle mainBundle] URLForResource:@"Entity" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeUrl]; return _managedObjectModel;}@end
怎實現IOS開發中的資料存放區方式
需要根據具體的業務情境,選擇 合適的資料存放區方式。[*](1) 使用者預設設定 – 這種情況通常不需要使用者幹預,如遊戲通關資訊,Video播放記錄,或者 App 退出之後,下次進入時,希望恢複到退出時的情況。[*](5) 遠端資料庫 – 這個一般由 App 調用遠端的 RESTFulWCF 服務,將 JSON或者 XML 資料傳遞給遠端的 Web 服務,讀寫資料庫的邏輯完全在 Web 服務端實現。
手機與電腦之間傳送資料的幾種簡便方法
檔案、照片、文檔、音樂、電子書、視頻等數字化資料通常是分別儲存在手機、平板電腦、個人電腦等多種裝置裡的。你知道如何將Android智能手機裡的檔案快捷方便地發送到iPad裡嗎?電腦記事本裡儲存的很長的文章怎樣才能在iphone裡複製和粘貼呢?下面就向大家介紹幾種,通過Web端和智能手機App,在電腦和手機之間傳送檔案和資料的幾個快捷方法。使用案頭應用大家最熟知的便是通過Email互相傳送檔案這種方法,誰都會使用。檔案來自某個裝置,再下載到另一個裝置裡。還可以通過提供雲資料儲存服務的Dropbox、Google Drive、SkyDrive等互相傳送資料。甚至可以不通過軟體而使用Web端應用程式,實現不同裝置間的資料傳送。如果使用“ge.tt”,可以通過瀏覽器上傳資料,再在其它裝置上通過瀏覽器下載資料。另外通過“JustBeamIt”可以不用擔心伺服器在你想要讀取資料時、直接發送資料,並且沒有檔案大小的限制。如果是記事則使用Google Keep發送記事本內容時,使用“Google Keep”是最便利不過的了。直接在Google Keep上記錄、複製、粘貼,立刻就可以能過其它裝置查看了。這是在Web端使用的一種服務,但是作為Android應用也可以使用。我是把通過地址欄和手機輸入的很長的密碼從電腦發送到手機。其它還有幾種可以發送連結和記事本的應用,如:“Hopper”和“MoPad”等。如果是Android系統則使用AirDroid使用Android系統的人,用手機收發檔案時估計只用“AirDroid”就足夠了吧。啟動AirDroid後通過瀏覽器就可以把Android系統內的檔案和檔案夾上傳或下載到電腦上。但是手機和電腦必須同時使用相同的Wi-Fi網路。2台Android裝置之間資料相互傳輸時也可以使用“Super Beam”。 從檔案管理應用中選擇幾個檔案後,在Android的共用菜單裡選擇SuperBeam就會產生相應的二維碼。另一方的裝置上運行SuperBeam並讀 取發送方的二維碼就可以自動傳送檔案。2台Android裝置之間沒有串連相同的Wi-Fi的情況下,使用Wi-Fi Direct傳送檔案。如果是Mac系統可以使用Droid NAS和Documents app如果使用Mac的話,下載個“Droid NAS”情況會怎麼樣呢?在Finder裡找到你的Android手機或平板,通過Wi-Fi就可以簡單地進行檔案傳輸了。對於和Android不一樣的Apple,除了媒體庫以外沒有iOS專用的檔案系統。通過Wi-Fi把電腦裡的文檔、照片、其它檔案等傳送到iPad和iPhone裡,還是使用“Documents app”比較好。通過這款APP,檔案可以從電腦上傳到網路驅動再傳到iOS裝置裡。在Android和iOS之間傳送時,是Bump還是Hoccer好呢?iOS系統裡不能通過藍芽傳輸檔案。照片和視頻從iPhone和iPad的專輯裡移出的時候,還是使用Dropbox比較方便吧?如果是單一的檔案,ge.tt和DropCanvas.com也是適用的。Android和iOS之間,或者是電腦和手機之間便捷的傳送檔案時,推薦使用“Bump”和“Hoccer”等移動APP應用。使用Bump時,選擇手機上的檔案,在手機上敲擊空隔鍵後,電腦的瀏覽器上立即就可以看到那個檔案。Hoccer是通過2台手機並排橫放,照片就可以從一台裝置傳到另一台裝置。第一次使用這個應用時真是吃了一驚。