iOS資料存放區的幾種方式,ios資料存放區幾種

來源:互聯網
上載者:User

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台手機並排橫放,照片就可以從一台裝置傳到另一台裝置。第一次使用這個應用時真是吃了一驚。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.