0
回答
File System & App setting(文件系统和应用设置)
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

一、手机上的数据存储

由于Windows Phone的安全设置,每个应用程序只允许访问自己特定的存储空间,并不能访问操作系统或者其他应用的文件,当安装一个Windows Phone应用程序之后,该应用就会在存储器中开辟出一块只允许自己访问的空间(Isolated Storage),在Windows Phone7.1中称为独立存储, 在Windows Phone 8中称为本地文件夹,这样的设置大大提高了应用程序的安全性。

说明:Isolated Storage在Windows Store应用程序中并不可用,在Windows Store应用程序中替代其的是应用程序存储(Application Storage)。

Android为保存应用程序数据提供了数种选项,你可以根据你的具体需求来选择方案,比如数据是仅供应用程序自身访问还是可以与其他应用程序(用户)共享,数据需要多少存储空间等等。Android 所提供的存储方式有以下几种:

Shared Preferences:以键/值对的形式存储私有原始数据。

Internal Storage:在设备存储器上存储私有数据。

External Storage:在共享外部存储器上存储公共数据。

SQLite Databases:在私有数据库中保存结构化数据。

Network Connection:在网络上用你自己的网络服务器保存数据。

Android提供了一种方式使用content Provider来将你的私有数据暴露给其他应用程序。content Provider 是一个可选组件,可以对你的应用程序数据提供读/写权限,更多信息请参见content Providers文档

IOS有一个全面的用于收集、存储、访问和共享数据和工具和框架。Core Data对于Cocoa Touch应用程序是一种全功能的数据模型框架,然而SQLite对于低级关系数据库操作非常完美。应用程序可以通过基于URL的系统在所有IOS中进行数据分享。通过HTML5数据存储API,网页应用可以在客户端缓存数据。IOS应用程序甚至也可以访问应用程序全局数据,例如地址簿中的联系人,图片库中的照片。

1、本地文件夹

本地文件夹是应用程序存储数据的根文件夹,它独立于其他应用程序,可以使用此文件夹在手机上持久保存数据。

1、本地文件夹提供的API:

1、 DataContext:本地数据库文件存储在本地文件夹中。要连接到本地数据库,请在创建本地数据库对象时在路径中使用本地文件夹协议。有关更多信息,请参见Windows Phone 本地数据库

2、 IsolatedStorageSettings:使用本地文件夹中的键/值对。有关示例,请参见如何为 Windows Phone 创建设置页面

3、 IsolatedStorageFile:使用本地文件夹中的文件和文件夹。有关示例,请参见如何为 Windows Phone 存储文件和文件夹

4、 StorageFileStorageFolder:在使用本地文件夹中的文件和文件夹时,结合使用这些 API。有关实力,请参见Windows Phone 8相关文件和文件夹操作

5、 LocalFolder:当前 ApplicationData 类的LocalFolder 属性以 StorageFolder 对象的形式返回本地文件夹。使用 Path属性获取本地文件夹的完整路径。

2、序列化和反序列化

使用IsolatedStorageSettings时,需要对待存取数据进行序列化和反序列化操作,在存入之前先将对象序列化为JSON,在读取之后要将JSON反序列化为对象。这些操作可以使用位于System.Runtime.Serialization.Json命名空间中的DataContractJsonSerializer类。

// 定义一个对象
public class AppInfo  
{  
    public string ProductId { get; set; }  
    public string Name { get; set; }  
    public string IconUri { get; set; }  
    public double Size { get; set; }  
}  

// 将对象序列化为JSON字符串
public static string ToJson(this AppInfo app)  
{  
    var serializer = new DataContractJsonSerializer(app.GetType());  
    using (var ms = new MemoryStream())  
    {
        serializer.WriteObject(ms, app);  
        var array = ms.ToArray();  
        return Encoding.UTF8.GetString(array, 0, array.Length);  
    }
}

// 将JSON字符串反序列化为对象
public static T FromJson(this string jsonString)  
{  
    var ser = new DataContractJsonSerializer(typeof(T));  
    using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))  
    {  
        T jsonObject = (T)ser.ReadObject(ms);  
        return jsonObject;  
    }  
}

3、本地文件夹URI模式

当定位本地文件夹的路径时,可以使用 isostore 或 ms-appdata URI 方案名称编写本地文件夹地址。尽管这两种 URI 方案都可以用来访问本地文件夹,但它们不可以互换使用。对 Windows 命名空间中的 API,使用“ms-appdata:///local/”来定位本地文件夹的根目录。对于所有其他 API,使用“isostore:/”来定位本地文件夹的根目录。以下代码展示了一些如何使用这些 URI 方案的示例。

// Create a local database in the local folder with the isostore URI scheme.
MyDataContext db = new MyDataContext("isostore:/mydb.sdf");

// Get a file from the local folder with the ms-appdata URI scheme.
var file = await Windows.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/AppConfigSettings.xml"));

需要注意的是,ms-appdata 需要三个斜杠(“///”)而 isostore 仅需要一个斜杠(“/”),并且无论使用哪种URI方案,新文件和文件夹的路径在URI方案名称的最后一个斜杠后面不能超过185个字符。

4、本地文件夹中的特殊用途文件夹

本地文件夹除了用于常规的数据存储,还会创建一系列文件夹用于特定场景的用途,这些文件夹都是在程序安装时被创建,但是可以都可以被删除。

1、 Shared:用于托管 MediaShellContent 和 Transfers 文件夹。

2、 Shared/Media:专辑封面:应用程序可以在播放背景音频时使用此文件夹在通用音量控件 (UVC) 中显示专辑封面。更多信息,请参见如何与 Windows Phone 的“音乐和视频”中心集成

3、 Shared/ShellContent:图块:图块可以显示每个图块正面和背面上的背景图像。背景图像可以存储在本地文件夹,但是必须位于此文件夹或其子文件夹中。更多信息,请参见Windows Phone 的图块

4、 Shared/Transfers:后台文件传输:即使当应用不再在前台中运行时,应用仍可以将文件保存到后台中的本地文件夹。更多信息,请参见Windows Phone 的后台文件传输

5、 PlatformData:当应用使用照片选择器任务时创建此文件夹。有关更多信息,请参见如何使用 Windows Phone 的照片选取器任务

5、浏览本地文件夹

独立存储资源管理器 (ISETool.exe)是随Windows Phone SDK一同提供给开发者的命令行工具,可以在模拟器或Windows Phone设备上使用独立存储资源管理器来验证文件是否保存在正确的位置,以及是否具有正确的数据,更多信息,请参见如何使用 Windows Phone 的独立存储资源管理器工具

6、Android和IOS上的情况

在Android中,SharedPreferences类提供了一个通用的框架,可以允许用户以原始数据类型持久保存和读取键/值对。你可以使用SharedPreferences保存任何类型的原始数据:布尔型,浮点型,整型,长整型和字符串型。这些数据可以跨实例保存(即使你的应用程序被终止)。你也可以直接将文件保存在内部存储器中,默认情况下,保存在内部存储器中的文件是私有的,只能供你的应用程序访问,其他应用程序无法访问这些文件(其他用户也同样无法访问)。当用户卸载你的应用程序的时候,这些文件也会同时被删除。

如果你要缓存一些数据,而不是长久保存,你可以使用getCacheDir()方法来打开一个内部存储中的File,在这里你的应用程序可以用来保存临时的缓存文件。

当你的设备内部存储空间不足时,Android可以删除这些缓存文件来释放空间,然而你不应该依赖于系统的清除功能,你需要经常自己维护缓存文件,使空间消耗保持一个合理的范围,例如1MB。当用户卸载应用程序的时候,这些缓存文件会被卸载。

对于IOS应用,Core Data为创建基于MVC模式的Cocoa应用程序提供了一种灵活且功能强大的数据模型框架。Core Data提供了一种通用的数据模型解决方案,这种方案用于处理应用程序每一种数据模型的需求。你可以在这之上创建任何类型的应用程序,从联系人管理软件到矢量艺术插图程序。

2、媒体库

媒体库是操作系统在手机上存储照片、音乐和视频的地方,库中的媒体以一种结合的方式存储在内置存储和外置存储(SD卡,如果可用)中。然而,媒体库是一种虚拟的存储容器,它不区分文件存储于何处,可以使用Microsoft.Xna.Framework.Media.MediaLibrary的API来访问媒体库中的文件。媒体库的拓展API(来自于Microsoft.Xna.Framework.Media.PhoneExtensions命名空间)提供了媒体库对象的附加功能。更多信息,请参见Windows Phone的媒体。媒体库中提供的API主要有以下几个:

1、 AlbumsArtistsSongs:只读访问音乐。

2、 PicturesRootPictureAlbumSavedPictures:只读访问图片。

3、 SavePicturesSavePictureToCameraRoll:将图片添加到“保存的图片”和“相机图片”文件夹。

4、 SaveSongDelete:向媒体库中添加删除歌曲。注:当保存歌曲时,不要使用isostore URI模式的名称。

5、 GetPath:从指定图片对象获取照片的文件路径。

重要说明:要访问应用中的媒体,必须在应用清单文件WMAppManifest.xml中指定相关功能,更多信息请参见Windows Phone清单文件

3、外置存储

对SD卡的直接访问是只读的,并且仅限于你的应用程序在文件关联中所注册的文件类型。更多关于外置存储的信息,请参见从Windows Phone 8上读取SD卡。如果要从应用程序访问SD卡,你必须在应用程序清单文件中指定ID_CAP_REMOVABLE_STORAGE功能。以下是访问SD卡的一些API。

1、 ExternalStorageDevice:表示SD卡,使用ExteranlStorageID属性来唯一标识一张SD卡。

2、 GetExternalStorageDevicesAsync:返回插入手机中的SD卡的集合,此集合中的SD卡数目不超过一张。

3、 ExternalStorageFolder:表示SD卡上的一个文件夹,稍后可以使用Path属性来访问该文件夹。

4、 ExternalStorageFile:表示SD卡上的一个文件,稍后可以使用Path属性来访问该文件。

5、 GetFileAsync(String)GetFolderAsync(String):直接从外置存储设备对象中获取一个文件或者文件夹。

对于Android设备,都支持一个共享的可以用来存储文件的外部存储器,这可以使一个可移动存储介质(例如SD卡)或者内部(不可移动)存储器。保存在外部存储器中的文件都是全局可读的,并且当用户启用USB大容量存储设备向计算机传送文件的时候可以被用户修改。

有可能一个设备使用内部存储器的一部分作为外部存储器的同时也提供一个SD卡插槽。在这种情况下,SD卡并不是外部存储器的一部分,你的应用程序也无法访问它(额外的存储空间仅用于系统扫描用户提供的多媒体文件)。

注意:如果用户将外部存储器挂载到计算机上或者移除了介质,外部存储器就会变得不可用,并且保存在外部存储器上的文件也没有安全保障。所有的应用程序都可以在外部存储器上读写文件,这些文件也可以被用户删除。所以对外部存储器做任何操作之前,都要调用getExternalStorageState()方法来检测介质是否可用。其返回值可以显示存储介质可能被挂载到了一台电脑上、遗失、只读,或者处于其他状态。当你的应用程序需要访问存储介质的时候,你可以使用这些信息来提示用户。

如果你想要保存并不是仅仅针对你的应用程序的文件,并且当应用程序卸载的时候不要被删除,则可以将这些文件保存到外置存储器的公共文件夹中,这些文件夹存在于外置存储器的根目录中,例如Music/、Pictures/、Ringtones/和其他的目录。

对于IOS设备,不支持外部存储。

4、Win32API

Windows Phone 8也支持部分Win32存储API用于本地文件夹。有关支持的Win32 API的完整列表,请参见Windows Phone 8支持的Win32 API

二、Windows Store应用程序数据存储

说明:Windows Store主要应用在平板电脑与PC机,与手机平台有很大不同,所以单独列出一条来进行描述,Windows Store的本地文件夹并没有提供配额管理的功能,当开发应用程序时,应该谨慎使用本地文件夹来存储数据,并应该告诉用户使用了多少空间,定时删除不需要的内容,并可以考虑将数据同步至云端服务器中。

1、应用数据类型

应用程序频繁管理或者与之交互的数据一共有两种类型。

1、应用数据

应用程序自身创建和管理的数据,此为特定于内部函数或特定应用配置的可变数据。它包含运行时状态、用户首选项、参考内容(如字典应用中的字典定义)以及其他设置。应用数据与应用存在性关联并仅对于该应用有意义。

2、用户数据

当用户使用应用程序的时候创建和管理的数据,它包含文档或媒体文件、电子邮件或通信脚本或保留用户所创建内容的数据库记录。注意,用户选择的首选项或应用配置选项都被视为应用数据,而不是用户数据。用户数据可能对于多个应用都非常有用或有意义。通常此为用户要操作或作为独立于应用自身的实体传输的数据,例如文档。

将 Windows 应用商店应用的应用数据存储在系统为其提供的数据存储(特定用于该应用和用户)中。然后,系统可以管理这些数据存储并使其独立于其他应用和其他用户。当用户为应用安装更新时,系统会保留这些数据存储。当用户卸载应用时,系统也会干净彻底地删除这些存储的数据。为了规避这些特点,请不要在用于存储应用数据的存储中保存用户数据。

由于应用数据存储的生存期与应用的生存期有关,因此不要在用于应用数据的数据存储中存储用户数据,例如文档或媒体。请使用用户的库和 Microsoft SkyDrive 来存储此类信息。

2、各种数据位置、限制及其推荐用法

下面总结了应用可以使用的各种数据位置、限制及其推荐用法。在使用 JavaScript 的 Windows 应用商店应用内会限制对某些数据位置的访问,具体取决于文档的上下文。所有存储大小限制还会受到存储媒体整体大小的束缚。

1、用户数据

1、由 Windows 运行时 StorageFile 和 file pickers 访问的库:

可用于:使用 JavaScript 的 Windows 应用商店应用(本地上下文)。

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用。

组合使用 DirectX 和 C++ 的 Windows 应用商店应用。

功能和限制:加载文件并将文件保存至用户的库。

异步 API。

无大小限制。

使用文件和文件夹选取器可让用户控制选择或创建文件。

需要在应用程序清单中为每个库指定访问许可,除了已经有读写权限的下载文件夹。

需要在应用程序清单中指定所需文件类型的拓展名,以便这些文件可在“文档”中或可移动存储位置打开。

推荐用法:用于旨在超出应用生存期或由用户独立管理的用户数据。

2、SkyDrive

可用于:使用 JavaScript 的 Windows 应用商店应用。

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用。

使用 DirectX 的 Windows 应用商店应用。

功能和限制:支持存储云中的用户数据并可供多个设备平台使用。

基于 REST 和 JavaScript 对象表示法 (JSON) 的 API。

限制为经过明确定义的受支持文件格式的列表。

允许访问由其他用户共享的内容。

大小限额基于用户账户。

推荐用法:用于用户希望从多个设备、平台或应用中访问的用户数据。

3、HTML5 File API

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)。

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用。

使用 DirectX 的 Windows 应用商店应用。

功能和限制:Web 标准。

推荐用法:仅在涉及上传和下载文件的场景中优先选用。若要在应用不活动时继续进行传输,请使用本地环境中提供的 Windows 运行时 BackgroundTransfer 命名空间。

除了以上提到的存储选项之外,还可以使用第三方提供的数据库和云存储解决方案。

2、应用数据

1、用于Windows运行时的应用程序数据API

可用于:使用 JavaScript 的 Windows 应用商店应用(本地环境)。

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用。

使用 DirectX 的 Windows 应用商店应用。

功能和限制:提供本地数据存储和漫游数据存储。

还提供了由系统进行磁盘清理的临时数据存储。

支持高度结构化的内容(设置)。

支持复合类型(一组作为基本单元管理的设置)。

支持非结构化的数据(文件)。

设置使用同步 API。

文件使用异步 API。

每个设置限制大小为 8K,每个复合设置限制大小为 64K;设置的数量没有限制,但是我们建议存储少于 1MB 的数据。

文件没有大小限制。

对于每个程序包,都会限制漫游文件和设置的整体大小,如ApplicationData.RoamingStorageQuota 中所定义,否则漫游不会发生。

为了节约带宽并保证电池使用时间,系统会管理何时会发生漫游。优先级高的设置漫游的频率会高于其他设置。

临时数据没有大小限制。

推荐用法:用于设置和非结构化的数据文件。

2、IndexedDB

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)。

功能和限制:ISAM 存储技术。

索引或顺序光标导航。

对于每个应用,存储限制为 250MB。

对于小于 30GB 的驱动器,所有安装应用存储总量限制为 375MB。

对于 30GB 和更大的驱动器,所有安装应用存储总量限制为驱动器大小的 4% 或 20GB(取较小值)。

基于网页的 Web 环境的页面只能使用 IndexedDB如果该页面的 URL 位于应用程序清单的 ApplicationContentUriRules 部分中,除非在应用的起始页上设置 ms-enable-external-database-usage的 meta 标记。

推荐用法:用于结构化数据和索引数据存储以仅供 JavaScript 使用。它主要用于缓存情况。

3、可拓展存储引擎(ESE)

可用于:必须由应用程序而非开发人员将调用包装在 Windows 运行时对象中,非 C/C++ 调用才可使用该应用。

功能和限制:ISAM 存储技术。

索引或顺序光标导航。

事务性数据。

即便是在系统崩溃的情况下仍然具有健壮的数据一致性。

为快速检索而缓存数据。

可扩展至较大尺寸,通常超过 50 GB。

存储在普通的二进制文件中,通过其他途径放置在磁盘上,如 Windows 运行时ApplicationData API 。

仅提供 C/C++ API。

推荐用法:用于结构化数据和索引数据存储,以供 C/C++ 使用或在开发者编写的 Windows 运行时对象中隐藏。

4、HTML5 Web Storage

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用(使用 WebView 控件)

功能和限制:使用字符串键-值对。

Web 标准。

在每个用户和每个应用程序的基础上,独立于浏览器缓存。

同步 API。

具有 10MB 的大小限制。

推荐用法:当在 Web 环境中需要轻量级存储且 Windows 运行时不可用时请使用localStorage。请不要使用 sessionStorage,因为它仅存在于内存中并且随着应用程序的终止而消失。仅将其用于不可能在用户离开应用时被打断的内存存储。

5、WinJS.Application.session.State

可用于:使用 JavaScript 的 Windows 应用商店应用(本地环境)。

功能和限制:具有应用定义属性的 JavaScript 对象。

会被挂起的Windows JavaScript库自动保存到本地 ApplicationData

无大小限制。

推荐用法:当应用程序挂起或者被终止时作为一个暂时存储应用程序状态的地方,以便能够以相同的状态来恢复应用程序。

6、WinJS.Application.local 状态存储

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)。

功能和限制:ApplicationData 的方便封装。

当处于 Web 环境中时,采用内存中实现的方式。

推荐用法:用于必须运行在 Web 环境和本地环境中的 JavaScript。

7、WinJS.Application.roaming状态存储

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)。

功能和限制:ApplicationData 的方便封装。

当处于 Web 环境中时,采用内存中实现的方式。

推荐用法:用于必须运行在 Web 环境和本地环境中的 JavaScript。

除了以上提到的存储选项之外,还可以使用第三方提供的数据库和云存储解决方案。

3、服务器

当应用程序与 Web 站点和 Web 服务交互时,它可以使用一些其他数据存储位置。

1、HTML5 Application Cache

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)

使用 JavaScript 的 Windows 应用商店应用(使用基于 Web 的应用程序缓存清单)

功能和限制:Web 标准。

允许预先获取基于 Web 的应用标记、脚本、样式表以及资源以方便脱机使用。

本地环境下的页面仅可以使用基于 Web 的应用程序缓存来获取不包含代码的资源。例如,可以使用它来获取图像、音频、视频或 XML 以供脱机使用。

无法通过脚本编写。

对于 Web 环境中要访问应用程序缓存的页面,必须将该页面的 URL 添加到应用程序清单的 ApplicationContentUriRules 部分。 本地环境中的页面没有此要求。

推荐用法:当内容为只读时、从 Web 服务器传送时以及在设备脱机状态需要访问时使用。尽管 HTML5 Application Cache 可用于传递个性化的内容,它主要目的是作为脱机访问数据缓存策略。

2、Cookie

可用于:使用 JavaScript 的 Windows 应用商店应用(Web 环境和本地环境)。

使用 C++、C# 或 Visual Basic 的 Windows 应用商店应用(使用 WebView)。

使用 IXMLHTTPRequest2 的应用。

功能和限制:Web 标准。

在每个用户和每个应用程序的基础上,独立于浏览器缓存。

每个 cookie 大小限制为 4K,cookie 数量无限制。

通过 XHR 在本地环境中的页面与 Web 之间往返的 Cookie 受制于正常的 Web 跨域 Cookie 共享规则

推荐用法:用于必须与每个 Web 服务器请求共享的数据。

3、云服务、OpenData 服务以及云数据库

可用于:任何应用程序。

功能和限制:允许使用完整的云数据库解决方案。

启用服务器端触发或定期处理。

功能取决于所采用的云服务。

推荐用法:在处理大量的由第三方源生成的或者在应用程序中显示的同时还需要在网站上显示的内容时首选。

3、漫游应用数据

Windows 8 可在用户设备之间自动传输某些应用数据。应用开发人员无需再执行费力的工作。漫游应用数据为最终用户提供使用多台设备(例如办公电脑和家用平板电脑)的卓越应用体验。 按照下面的指南,在你设计应用时加入应用数据漫游功能(如若适用)。

如果用户先在一台设备上使用你的应用后,再在另一台设备上安装此应用,那么在第一台设备上进行的所有设置和首选项都将自动应用到第二台设备并可供使用。这样可提供最佳用户体验,包括你的应用在用户第二台设备上的最少设置工作,因为每项设置都已根据用户首选项进行配置。以后对这些设置和首选项进行的任何更改也将自动传输,从而提供所有设备都保持统一的体验,即使设备随着时间而进行升级或更换亦如此。 除了设置和首选项之外,Windows 8 还可传输会话或状态信息。这样,当一台设备上的应用会话传输到另一台设备后,即使会话在该台设备上已关闭或已放弃,最终用户仍可继续使用该会话。

  Windows 系统限制了每个应用程序可漫游的应用数据的大小。 具体信息请参阅 ApplicationData.RoamingStorageQuota | roamingStorageQuota。如果应用达到这一限制,在应用的总漫游应用数据再次少于该限制之前,不会将应用的任何应用数据复制到云。出于此原因,最好的做法是仅为用户首选项、链接和小型数据文件使用漫游数据。

通常,应用不希望更改它的数据。但是,漫游应用数据随时可能更改。应用应该注册处理 DataChanged | datachanged 事件,处理操作在漫游应用数据更改时执行。

如果由于用户安装了一个较新的应用版本,设备上的应用数据更新到一个新版本,它的应用数据将被复制到云。在设备上更新应用之前,系统不会将应用数据更新到用户安装了该应用的其他设备。

只要用户可在所需的时间间隔内从某个设备访问应用的漫游数据,这些数据就存在于云中。如果用户不会在比此时间间隔更长的时间内运行应用,它的漫游数据将从云中删除。如果用户卸载应用,它的漫游数据不会自动从云中删除,将会保留。如果用户在该时间间隔内重新安装该应用,会从云中同步漫游数据。当前的策略将此时间间隔指定为 30 天。 位置通过 roamingFolder 属性提供。

Windows 会随机漫游应用数据,不会保证即时同步。如果用户脱机或位于高延迟网络中,则漫游可能会明显延迟。对于时间关键的重要设置,可使用优先级特别高的设置单位提供更为频繁的更新。它仅限于名称为“HighPriority”的一个特定设置单位。它可以是复合体,但总大小限于 8KB。此限值不是强制性的,当超过此限值时,设置单位或设置复合体将被视为常规设置单位或复合体。

相关示例代码,请参阅:

快速入门:漫游应用程序数据 (JavaScript)

快速入门:漫游应用程序数据 (C#/VB/C++)


举报
顶部