在iOS应用中在设备上本地保存数据的最佳方式

时间:2016-05-20 07:03:43

标签: ios swift optimization

我正在制作我的第一款iOS应用程序,该应用程序将部署用于iPhone和iPad。该应用包含需要与应用捆绑在一起的数据,这些数据将在设备离线时使用。

离线版本至少包含35-40条记录,每条记录包含图像(将在应用程序中捆绑,仅保存名称),以及varchar字段,该字段至少为1000个字和一个{ {1}}字段。

我找到了三种可能的解决方案

  1. 但是,使用数据库(booleanSQlite)保存所有字段 我担心这个表有1000个字。但是由于 varchar字段可能会有所不同,我需要分配最大2000(或更多,具体取决于关键字的实际长度) 限制(这将导致不必要的内存资源分配)

  2. 我想要的另一种方法是在本地以json的形式保存信息,并在需要时使用它并保存布尔字段(仅在Coredata中本地为真)

    < / LI>
  3. 使用上面讨论的JSON方法并创建一个用于管理布尔字段的数据库。
  4. 我想征求NSUserDefaults社区关于这种情况下理想/优化方法的意见。此外,我也对任何其他方法持开放态度。

    修改1 拟议的临时数据库结构

    StackOverflow

4 个答案:

答案 0 :(得分:2)

听起来好像文本字段(包含1000-2000字)是与应用程序捆绑在一起的静态文本,并且应用程序的用户无法更改。如果是这种情况,那么您可以使用plist文件或JSON文件将该数据存储在应用程序包中,并根据需要加载它(假设您不需要搜索它)。

然后,如果这些记录中的每一个都只有一个可由用户更改的boolean值,那么这些值可以非常轻松地存储在NSUserDefaults中(因为您已声明只是在处理有35-40个记录)。您可以使用idboolean链接到数据文件。

您可以使用Core DataRealm来存储数据,但如果您不需要搜索功能且用户无法更改文本,则可能过度杀伤。但是,如果您使用数据库选项,请注意您无法在iCloud备份的位置存储静态数据(文本),否则Apple将拒绝您的应用。无论您是否在应用程序中使用iCloud。因此,如果您要创建Core Data持久性存储并将其保存到用户Documents文件夹,然后加载所有静态数据,您将被拒绝。您可能希望将该数据存储保存在用户Cache文件夹中,以便iCloud不备份它。之后您将遇到的问题是您希望用户选择备份boolean值。这意味着他们需要存储在不同的地方。 Core Data确实有一项功能,可让您创建Configurations,将用户可更改数据与不可更改数据分开,但同样,这对您的案例来说太过分了。

对于这么小的数据集,我建议从Realm开始'核心数据'。启动和运行起来要容易得多。

答案 1 :(得分:1)

如果您需要查看这些字段,CoreData是最好的方法,因为您可以使用NSPredicates轻松访问您的数据,(就像SQL where语句一样)。

但是如果你需要在每次启动时加载所有内容,你可以将所有内容存储到一个文件(plist,son ......),因为它更容易管理和更新(如果你更新CoreData Model,应用程序更新中的更改可能很复杂。

所以我的简短回答是:

  

如果你需要教你的数据=&gt; 核心数据

     

Else =&gt; 本地存储上的文件

不要使用UserDefault来实现这一点,这不是为它而设计的。

答案 2 :(得分:0)

这取决于您的数据库的复杂性和操作。

请注意,首先,无论您使用何种数据库系统,都没有性能差异。

每个数据库系统都有不同的复杂性和操作限制。

例如,使用NSUserDefaults来存储和检索数据非常简单。

但是,如果您需要在批量数据之间执行relational operation,那么最好使用sqlite or core data。与Relational database operations相比,sqlite or coredata可以轻松执行property - list

如果您的数据只是键值对的类型,还有另一个选项Core data可用。

sqlite完全基于user defaults or property list。在root核心数据本身使用sqlite。

核心数据和sqlite之间的区别在于:核心数据为使用它提供了更大的灵活性,但学习起来比较困难或复杂。 sqlite与核心数据相比没有提供灵活性,但学习和使用起来并不复杂。灵活性意味着例如:您可以看到核心数据的可视化表示。可以直观地添加实体或属性等。

因此,根据您的需要和使用的复杂性选择数据库,或者根据您需要执行的操作选择数据库。您的数据库不是很大而且不复杂,不需要任何关系操作或多个表,那么您也可以使用angular.module('starter.controllers', []) .controller('AppCtrl', function($scope, $ionicModal, $timeout) { // With the new view caching in Ionic, Controllers are only called // when they are recreated or on app start, instead of every page change. // To listen for when this page is active (for example, to refresh data), // listen for the $ionicView.enter event: //$scope.$on('$ionicView.enter', function(e) { //}); // Form data for the login modal $scope.action = { // name:'', // date: '', // type:'' }; $scope.placeholder="01/01/2016"; // Create the login modal that we will use later $ionicModal.fromTemplateUrl('templates/addAction.html', { scope: $scope }).then(function(modal) { $scope.modal = modal; }); // Triggered in the login modal to close it $scope.closeActionModal = function() { console.log('hello'); $scope.modal.hide(); }; // Open the login modal $scope.openAddActionModel = function() { $scope.modal.show(); $('#action_datePicker').val(new Date()); }; // $scope.abc = function(){ // console.log('asdavshahs'); // alert('Hello'); // } // Perform the login action when the user submits the login form $scope.saveData = function() { console.log('Doing login', $scope.action); // Simulate a login delay. Remove this and replace with your login // code if using a login system $timeout(function() { $scope.closeActionModal(); }, 1000); }; })

希望这会有所帮助:)

答案 3 :(得分:0)

投入选项。

为了让以后更容易,我建议使用CoreData。这使您可以轻松管理产品的读写。这也为您提供了良好的持久存储。

描述问题;您可以使用引用您在CoreData中存储的产品的唯一名称将每个产品的描述存储在其自己的文件中。在您的CoreData实体中,您定义了一个descriptionFile,它将保存文件路径。

这种方法使您在获取对象时更容易使用CoreData,也许您需要一个不需要显示描述的浏览视图,因此您无需将描述文本加载到内存中。选择产品后,加载该产品的描述文件并在其中显示文本。

快乐编码:)