第三章:iOS的資料存放區與IO

來源:互聯網
上載者:User

如果應用程式值需要儲存程式參數、選項相關的少量資料,則可使用NSUserDefaults進行儲存;
如果應用程式只是少量資料需要儲存,那使用屬性列表檔案就可以了;
如果應用程式有大量資料需要儲存、訪問,就需要藉助於資料庫.iOS系統內建了SQLite資料庫,SQLite資料庫是一個真正輕量級的資料庫,他沒有後台進程,整個資料庫就對應於一個檔案,這樣就可以非常方便的在不同裝置之間移植.iOS為訪問SQLite資料庫提供了兩套API:基於C語言風格的libsqlite3.dylib和物件導向的Core Data. 一、應用程式沙箱

為了提供更好的安全機制,iOS提供了應用程式沙箱機制,這種機制保證每個應用程式只能訪問本沙箱內的資料,避免與其他應用形成衝突.在OS X系統中查看應用沙箱,有兩種方式: (1)、開啟Finder應用程式,通過”commend+shift+G”快速鍵開啟”前往檔案夾”對話方塊,使用者可以在該對話方塊中輸入”/user/<使用者名稱>/library/“,這樣即可進入OS X的庫名錄.然後依次進入該目錄下的Application Support/iPhone Simulator/7.0/Applications子目錄(此處是進入iOS模擬器);

注意:Xcode 5和Xcode 6的模擬器路徑比較
①、Xcode 5中模擬器路徑為:/Users/使用者名稱/Library/Application Support/iPhone Simulator

②、Xcode 6中模擬器路徑為:/Users/使用者名稱/ Library/Developer/CoreSimulator

其中Devices檔案夾下的16個檔案對應Xcode6下的16個模擬器,可以根據各個檔案夾下的device.plist檔案得到具體的是哪個模擬器:



注意:Xcode 5和Xcode 6的沙箱路徑比較
①、Xcode 5中沙箱的路徑為:/Users/使用者名稱/Library/Application Support/iPhone Simulator/7.1-64/Applications/對應應用程式檔案夾
Document
②、Xcode 6中沙箱的路徑為:/Users/使用者名稱/Library/ Developer/CoreSimulator/Devices/模擬器UDID/data/Containers/Bundle/Applications/對應應用程式檔案夾

注意:Xcode 5和Xcode 6的喜好設定目錄比較
①、Xcode 5中喜好設定目錄的路徑為:/Users/使用者名稱/Library/Application Support/iPhone Simulator/7.1-64/Applications/對應應用程式檔案夾/Library/Preferences

②、Xcode 6中喜好設定目錄的路徑為:使用NSUserDefault方式建立的plist檔案的具體路徑為:/Users/使用者名稱/Library/ Developer/CoreSimulator/Devices/模擬器UDID/data/Library/Preferences
(2)、在OS X系統命令列視窗輸入”defaults write com.apple.finder AppleShowAllFiles -bool true”,然後退出Finder,重啟Finder程式即可看到隱藏檔案和檔案夾,這樣就可以直接尋找路徑.

顯示:defaults write com.apple.finder AppleShowAllFiles -bool true

隱藏:defaults write com.apple.finder AppleShowAllFiles -bool false

開啟任何應用程式的檔案夾,都可以看到如下檔案結構: ①、Documents:除了基於NSUserDefaults的喜好設定設定之外,應用程式的資料、檔案都儲存在該目錄下; ②、Library:基於NSUserDefaults的喜好設定參數儲存在Library/Preferences目錄下; ③、tmp:該目錄下供應用程式儲存臨時問檔案,當iOS執行同步時,iTunes不回備份tmp目錄下得檔案.因此當應用程式不在需要某個臨時檔案時,應該負責刪除tmp目錄下的臨時檔案,避免佔用系統空間. 1、擷取Documents目錄

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString* documentsDirectory = [paths objectAtIndex:0];
/Users/osx2014/Library/Developer/CoreSimulator/Devices/C99ACFA5-7162-497A-BA7F-0FF93C7F6867/data/Containers/Data/Application/FBFAF7C5-3053-45AA-A1A4-72B98E858A24/Documents

由於NSSearchPathForDirectoriesInDomains()函數並不是專門為iOS設計的,它最初是為了OS X系統設計的,因此在使用該函數的很多選項都不會返回任何值.該函數的第一個參數代表正在尋找Documents檔案夾,NSUserDomainMask參數代表僅尋找目前使用者的Home目錄. 2、擷取tmp目錄

NSString* tmpPath = NSTemporaryDirectory();
/Users/osx2014/Library/Developer/CoreSimulator/Devices/C99ACFA5-7162-497A-BA7F-0FF93C7F6867/data/Containers/Data/Application/FBFAF7C5-3053-45AA-A1A4-72B98E858A24/tmp/
3、擷取caches目錄
NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);NSString *cachesDir = [cachePaths objectAtIndex:0];
/Users/osx2014/Library/Developer/CoreSimulator/Devices/C99ACFA5-7162-497A-BA7F-0FF93C7F6867/data/Containers/Data/Application/BB4C3035-9A66-4DDA-A74B-0B7FC10CC901/Library/Caches
4、擷取home目錄
NSString* homePaht = NSHomeDirectory();
/Users/osx2014/Library/Developer/CoreSimulator/Devices/C99ACFA5-7162-497A-BA7F-0FF93C7F6867/data/Containers/Data/Application/BB4C3035-9A66-4DDA-A74B-0B7FC10CC901
5、檔案儲存策略思考

當應用程式需要把運行狀態、使用者資料儲存下來時,通常會選擇儲存在應用程式沙箱的Documents檔案夾下,除了基於NSUserDefaults的資料會儲存在Library/Prefereences目錄下(Xcode 5),一些應用程式的臨時檔案會選擇儲存在tmp目錄下—一旦該檔案失去作用,應用程式應該立即刪除該臨時檔案,釋放手機上寶貴的儲存空間.

使用多檔案儲存資料的優缺點如下: (1)、優點:應用程式需要使用哪部分資料,就載入哪個檔案,從而避免一次性載入所有持久化資料帶來的記憶體緊張.應用程式修改了哪部分資料,只要儲存對應的檔案即可,這樣可以避免同時儲存所有的持久化資料. (2)、缺點:多檔案儲存資料必然帶來編程的複雜性,可能需要建立額外的資料結構去管理持久化內容與隱藏檔之間的對應關係. 二、應用程式參數與使用者預設設定

應用程式儲存少量的資料(字串、標量類型等),比如應用程式的各種配置資訊(如是開啟音效,是否使用震動效果等)、遊戲的玩家資訊(使用者名稱,密碼之類的)等,iOS提供了Settings Bundle來管理. 1、使用Settings Bundle

使用Settings Bundle設定應用程式參數的最大優勢在於:無須程式員開發介面,應用的設定介面完全由Setting應用提供,開發人員只要提供Settings Bundle這組檔案即可.開發人員為應用提供了Settings Bundle之後,該應用的參數設定介面由系統的Settings應用提供,使用者佈建的程式參數也由Settings負責儲存,每次開啟Settings進行設定時,Settings負責讀取使用者佈建的參數…..應用程式的參數設定介面、資料存放區、讀取邏輯的都由系統的Settings應用負責.
為項目增加一個Settings Bundle,步驟如下: 、單擊Xcode主菜單的”File”—>”New”—>”File…”功能表項目; 、選中”iOS”—>”Resource”分類下的”Settings Bundle”,然後單擊”Next”按鈕,系統進入儲存對話方塊,將該Settings Bundle儲存在項目的根目錄下,檔案名稱為”Settings.bundle”.



在Xcode中開啟Settings.bundle包含的Root.plist檔案,可以看到如下:

在iPhone Settings Schema節點下包含兩個子節點: (1)、Preference Items:該節點的類型為Array.該節點用於定義該Settings Bundle的設定介面.該節點下包含了Item0、Item1、Item2、Item3這4個節點. (2)、Strings Filename:該節點的類型為String,值為Root.該節點的作用是告訴系統到*.lproj檔案中找Root.strings檔案作為國際化資源檔—讀者可以在en.lproj檔案中找到Root.strings檔案,如果程式需要進行Settings Bundle國際化,則可增加zh-Hans.lproj等檔案夾,並在這些國際化資源檔內增加Root.strings檔案.

注意:plist屬性檔案的本質就是NSDictionary或NSArray,只不過plist屬性檔案對應的NSDictionary的key只能是NSString類型,而value可以是Boolean、NSData、NSDate、NSNumber、NSString、NSArray、NSDictionary類型.

單擊右鍵,選擇”Show Raw Keys/Values”功能表項目,該屬性編輯器將會顯示更真實的、未經處理的key和value,如下圖:

Item0、Item1、Item2、Item3每項對應Settings應用中的一個設定條目,每個設定條目用於設定一個應用程式參數,每項通常可指定如下4個通用項目: (1)、Title:該項配置應用程式參數的顯示標題;

(2)、Type:該項配置應用程式參數的類型.Type支援如下幾個屬性值. ①、PSTextFieldSpecifier:該類型指定應用程式參數是一個文字框,可由使用者輸入該參數的值; ②、PSTitleValueSpecifier:該類型指定應用程式參數與顯示標題相同; ③、PSToggleSwitchSpecifier:該類型指定應用程式參數表現為UISwitch控制項,使用者可通過該控制項設定該參數為YES或NO; ④、PSSliderSpecifier:該類型指定應用程式參數表現為UISlider控制項,使用者可通過該控制項設定一個浮點值; ⑤、PSMultiValueSpecifier:該類型指定應用程式參數表現為可供使用者選擇的列表,使用者可通過該列表選擇其中一個值; ⑥、PSGroupSpecifier:該類型定義一個分組; ⑦、PSChildPaneSpecifier:該類型定義一個子設定視圖.當使用者單擊這種類型的設定項時,系統將會開啟一個新的設定介面–定義這種類型的Item時,必須重新指定一個plist檔案來定義子設定視圖的介面.

(3)、Key:該項用於指定儲存應用程式參數的key—系統底層會採用NSDictionary來儲存這些應用程式參數,每個應用程式參數存入NSDctionary中都需要指定一個key,該項設定的值將會作為應用程式參數的key. (4)、DefaultValue:該項指定應用程式參數的預設值.

(1)、設定分組
如下圖:

(2)、設定文字框參數
將Type設為”PSTextFieldSpecifier”代表文字框參數–這個程式參數允許使用者自由的輸入參數值.文字框參數同樣可通過Title、Key、Default指定參數的顯示標題、儲存參數的key、預設值.除此之外,文本款參數還可指定如下選項: ①、AutocapitalizationType:用於指定該文字框的自動大寫類型.該選項支援的值與UITextView的Capitalization屬性支援的屬性值完全相同. ②、Autocorrection Type:用於指定該文字框的自動校正類型.該選項支援的值與UITextView的Correction屬性支援的屬性值完全相同. ③、IsSecure:該屬性值設為”YES”,表明這是一個密碼輸入框. ④、KeyboardType:指定該文字框關聯的虛擬鍵盤的類型.

(3)、設定UISwitch參數
將Type設為”PSSwitchSpecifier”代表只支援YES或NO的參數–這個程式參數允許使用者通過UISwitch控制項來設定參數值.UISwitch參數同樣可通過Key、Title、Default指定參數的儲存參數的key、顯示標題、預設值.

(4)、設定UISlider參數
將Type設為”PSSliderSpecifier”代表只支援浮點值的參數–這個程式參數允許使用者通過UISlider控制項設定參數值.UISlider參數同樣可通過Key、Default指定儲存參數的key、預設值.除此之外,UISlider還支援如下設定: ①、Minimum Value:指定滑塊位於該UISlider最左邊時所代表的最小值; ②、Maximum Value:指定滑塊位於該UISlider最右邊時所代表的最大值; ③、Minimum ValueImage:指定位於該UISlider最左邊代表最小值的圖片; ④、Maximum ValueImage:指定位於該UISlider最右邊代表最大值的圖片;

注意:需要將圖片放在Settings Bundle中,才能被Settings Bundle訪問.不能直接拖近Settings Bundle中,需要顯示包內容,還有將圖片複製進去.

(5)、設定多值參數
將Type設定”PSMultiValueSpecifier”,用於配置一個多值列表參數、使用者可通過列表選擇參數值.多值參數同樣可通過Title、Key、Default指定參數的顯示標題、儲存參數的key、預設值.除此之外,多值參數還支援如下設定: ①、Titles:需要提供Array集合,集合元素定義多個清單項目的標題; ②、Values:需要提供Array集合,集合元素定義多個清單項目的值;


(6)、設定子設定視圖
將Item5的Type設為”PSGroupSpecifier”和Item6的Type設為”PSChildPaneSpecifier”,用於配置子設定視圖,子設定視圖可通過Title設定顯示標題,也可通過File設定子設定視圖的plist檔案名稱.

注意:該子設定視圖需要一個My.plist檔案,與Root.plist格式完全相同,需要建立一個My.plist檔案,然後顯示包內容,複製到Settings Bundle中.

2、使用NSUserDefaults讀取、儲存應用程式參數

擷取NSUserDefaults單例:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

擷取NSUserDefault對象之後,可通過如下方法來擷取、設定參數: (1)、xxxForKey:(NSString *)key:根據指定的key來擷取對象的參數值.隨著參數實值型別的不同,xxx可以隨之改變; (2)、setXxx:value forKey:(NSString *)key:設定參數;
參數設定完成後,可調用NSUserDefault對象的synchronize方法進行儲存;

例如:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"你好,女神" forKey:@"key"];[defaults synchronize];NSString* name = [defaults objectForKey:@"key"];

注意:此處可讀取,設定上述Settings Bundle中的值

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];NSLog(@"%@",[defaults objectForKey:@"name"]);NSLog(@"%d",[defaults boolForKey:@"musicOn"]);NSLog(@"%f",[defaults floatForKey:@"gameSpeed"]);NSLog(@"%@",[defaults objectForKey:@"race"]);
三、屬性列表 (1)、只有當NSArray、NSDictionary集合儲存如下類型的對象後,才可調用 - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;方法執行儲存.
①、NSArray和NSMutableArray; ②、NSDictionary和NSMutableDictionary; ③、NSData和NSMutableData; ④、NSString和NSMutableString; ⑤、NSValue和NSNumber; (2)、當恢複這些資料時,只要調用NSArray、NSDictionary的xxxWithContentsOfFile:(NSString *)filePath;方法執行初始化 四、對象歸檔和原生I/O API

如果程式需要儲存一個自訂的執行個體,則可讓該類實現NSCoding協議,並實現該協議中定義的 - (id)initWithCoder:(NSCoder )aDecoder; - (void)encodeWithCoder:(NSCoder )aCoder;兩個方法,接下來可使用NSKeyedArchive進行歸檔,當程式需要回複該對象時,可使用NSKeyedUnarchive進行恢複. 五、使用SQLite資料庫 (1)、終端下得資料庫

①、建立檔案夾:mkdir sqlite;
②、建立表:create table(if not exists)表名(欄位名1,欄位名2…);
③、顯示表:.table;
④、刪除表:drop table 表名;
⑤、插入語句:insert into 表名(欄位名 1,欄位名 2…) values(值 1,值 2…)
⑥、顯示表內內容:select *from 表名;
⑦、刪除表內資料:delete from 表名 —刪除所有的資料
delete from 表名 where 條件 —刪除一條資料
⑧、修改:update 表名 set 欄位名 1= 值 1,欄位名 2=值 2… where 條件;
⑨、查詢:select 欄位名 from 表名;
select 欄位名 from 表名 limit n;查詢n條資料
查詢排序:select 欄位名 from 表名 order by 欄位名(desc);降序;
查詢多個:select count(*) from 表名;表名資料項目數;
select sum(uid) from 表名;uid的和
select avg(uid) from 表名;uid的平均
⑩、退出:.quit;
主要:主鍵 create table WUGONG(wid integer primary key auto increment name,uid); (2)、iOS的SQLite編程

在項目中使用iOS的SQLite編程API,需要先完成下面兩步:
①、為項目正價libsqlite3.dylib

②、在需要使用SQLite API的Objective-C類中使用如下代碼匯入libsqlite3.dylib

#import <sqlite3.h>

一般情況下,我們可以使用第三方資料庫FMDBDemo開使用資料庫,添加標頭檔

#import "FMDatabase.h"
(3)、建立資料庫和表
//首先需要擷取資料庫儲存路徑NSString* path = [NSHomeDirectory()  stringByAppendingPathComponent:@"Documents/data.db"];_db = [[FMDatabase alloc] initWithPath:path];//然後建立資料庫://開啟資料庫BOOL res = [_db open];if (res == NO) {NSLog(@"開啟失敗");return;}//建立表res = [_db executeUpdate:@"create table if not exists USER(name,image)"];if (res == NO) {NSLog(@"建立表失敗");[_db close];return;}//插入資料//NSNumber,NSString,NSDataNSData* data = UIImagePNGRepresentation(_imageView.image);res = [_db executeUpdate:@"insert into USER values(?,?)",_nameField.text,data];if (res == NO) {NSLog(@"插入資料失敗");}//關閉資料庫[_db close];
(4)、刪除資料
BOOL res = [_db open];if (res == NO) {NSLog(@"開啟失敗");return;}res = [_db executeUpdate:@"delete from USER where name=?",_nameField.text];if (res == NO) {NSLog(@"刪除失敗");[_db close];return;}NSLog(@"刪除成功");[_db close];
(5)、查詢資料
BOOL res = [_db open];if (res == NO) {NSLog(@"開啟失敗");return;}//查詢FMResultSet *set = [_db executeQuery:@"select *from USER"];while ([set next]) {//int//int a = [set intForColumn:]//NSNumber//NSNumber* num = [set objectForColumnName:]NSString *name = [set stringForColumn:@"name"];//NSData *data = [set dataForColumn:@"image"];NSLog(@"name = %@",name);}[_db close];
(6)、修改資料
BOOL res = [_db open];if (res == NO) {NSLog(@"開啟失敗");return;}NSData *data = UIImagePNGRepresentation(_imageView.image);//修改name;//res = [_db executeUpdate:@"update USER set name=? where image=?",_nameField.text,data];//修改imageres = [_db executeUpdate:@"update USER set image=? where name=?",data,_nameField.text];if (res == NO) {NSLog(@"修改失敗");[_db close];return;}NSLog(@"修改成功");[_db close];
六、使用Core Data架構 (1)、Core Data簡介

Core Data是一個純粹的物件導向架構,可用於管理實體以及實體之間的關聯關係的持久化—所謂的持久化,指的是Core Data可以將實體儲存到持久化存放裝置中,也可以在需要的時候將他們取出來;

Core Data底層的持久化儲存方式可以是SQLite資料庫,也可以是XML文檔,甚至可以直接以記憶體作為持久化儲存備(如果選擇記憶體作為持久化存放裝置,那麼應用重啟時,資料就會丟失);

Core Data的核心概念是實體.實體是由Core Data管理(簡稱被託管)的模型對象,它必須是NSManagedObject類或其子類的執行個體.實體與實體之間存在1-1,1-N,N-N的關聯關係,整個應用的所有實體以及的關聯關係被稱為託管模型(NSManagedObjectModel);

Core Data的核心對象時託管物件內容(NSManagedObjectContext,有時也簡稱上下文),所有實體都處於託管物件內容管理中,Core Data應用對實體所做的任何增、刪、改、查操作都必須通過託管物件內容來完成.
Core Data應用中的核心API有如下幾個: ①、託管物件模型(NSManagedObjectModel):該對象負責管理整個應用的所有實體以及實體之間的關聯關係.當開發人員使用Xcode的圖形介面設計了實體與實體的關聯關係之後,需要使用該對象來載入、管理應用的託管物件模型; ②、持久化儲存協調器(NSPersistentStoreCoordinator):負責管理底層的隱藏檔,例如SQLite資料庫等. ③、託管物件內容(NSManagedObjectContext):該對象是Core Data的核心對象,應用程式對實體所做的增、刪、改、查操作都需要通過該對象來完成. ④、實體描述(NSEntityDescription):對象代表關於某個實體的描述資訊,從某種程度來說,該對象相當於實體的抽象.實體描述定義了該實體的名字、實體的實作類別,並用一個集合定義了該實體包含的所有屬性. ⑤、抓取請求(NSFetchRequest):該對象封裝了查詢實體的請求,包括程式需要查詢那些實體、查詢條件、定序等.抓取請求定義了本次查詢的實體名字、抓取請求的查詢條件(通過NSPredicate來表示),並用一個NSArray集合定義了所有的定序;

使用Core Data持久化操作的步驟大致如下: 、建立NSManagedObjectModel對象來載入管理應用的託管物件模型; 、以NSManagedObjectModel對象為基礎,根據實際需要建立NSPersistentStoreCoordinator對象,該對象確定Core Data底層資料的儲存形式; 、以NSManagedObjectModel對象為基礎,建立NSManagedObjectContext,該對象是Core Data進行持久化訪問的核心對象; 、對於普通的增、刪、改、查操作,需要分別建立實體、刪除實體、修改實體,然後調用NSManagedObjectContext對象的save:方法將這些修改儲存在底層存放裝置. 、如果要執行查詢,則需要先建立NSFetchRequest對象,在調用NSManagedObjectContext的executeFetchRequest:error:方法執行查詢,該方法返回所有匹配條件的實體組成的NSArray. (2)、初始化Core Data項目

步驟如下:
①、為該項添加CoreData.framework架構;

②、建立一個”Data Model”檔案;

③、初始化Core Data應用必須得核心API對象:NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContext.
例如:這些核心API對象都屬於全域可用的對象,因此程式一般會在應用程式委託類中執行初始化:
應用程式委託類的介面部分:

#import <UIKit/UIKit.h>#import <CoreData/CoreData.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property(strong,nonatomic,readonly)NSManagedObjectModel* managedObjectModel;@property(strong,nonatomic,readonly)NSManagedObjectContext* managedObjectContext;@property(strong,nonatomic,readonly)NSPersistentStoreCoordinator* persistentStoreCoordinator;@end應用介面委託類的實現部分@synthesize managedObjectContext = _managedObjectContext;@synthesize manageObjectModel = _manageObjectModel;@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;- (void)saveContext{    NSError *error = nil;    //擷取應用的託管對象的上下文    NSManagedObjectContext* managedObjectContext = self.managedObjectContext;    if (managedObjectContext != nil) {        //如果託管物件內容中包含了未儲存的修改,則執行儲存,如果儲存失敗則記錄錯誤資訊        if ([managedObjectContext hasChanges]&&![managedObjectContext save:&error]) {            NSLog(@"儲存出現錯誤:%@,%@",error,[error userInfo]);        }    }}//託管對象-(NSManagedObjectModel *)managedObjectModel{    //如果_managedObjectModel已經被初始化,則直接返回該對象    if (_managedObjectModel!=nil) {        return _managedObjectModel;    }    //擷取實體模型檔案對象的NSURL    NSURL* modelURL=[[NSBundle mainBundle] URLForResource:@"User" withExtension:@"momd"];    //載入應用的實體模型檔案,並初始化NSManagedObjectModel對象    _managedObjectModel=[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    // _managedObjectModel=[NSManagedObjectModel mergedModelFromBundles:nil];    return _managedObjectModel;}//持久化儲存協調器- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{    //如果_persistentStoreCoordinator已經被初始化過,則直接返回該對象    if (_persistentStoreCoordinator != nil) {        return _persistentStoreCoordinator;    }    //擷取SQLite資料庫檔案的儲存目錄    NSURL* storeURL = [[self applicationDocumentDirectory]URLByAppendingPathComponent:@"Books.sql
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.