我正在制作我的第一款iOS应用程序,该应用程序将部署用于iPhone和iPad。该应用包含需要与应用捆绑在一起的数据,这些数据将在设备离线时使用。
离线版本至少包含35-40条记录,每条记录包含图像(将在应用程序中捆绑,仅保存名称),以及varchar
字段,该字段至少为1000个字和一个{ {1}}字段。
我找到了三种可能的解决方案
但是,使用数据库(boolean
或SQlite
)保存所有字段
我担心这个表有1000个字。但是由于
varchar字段可能会有所不同,我需要分配最大2000(或更多,具体取决于关键字的实际长度)
限制(这将导致不必要的内存资源分配)
我想要的另一种方法是在本地以json的形式保存信息,并在需要时使用它并保存布尔字段(仅在Coredata
中本地为真)
我想征求NSUserDefaults
社区关于这种情况下理想/优化方法的意见。此外,我也对任何其他方法持开放态度。
修改1 拟议的临时数据库结构
StackOverflow
答案 0 :(得分:2)
听起来好像文本字段(包含1000-2000字)是与应用程序捆绑在一起的静态文本,并且应用程序的用户无法更改。如果是这种情况,那么您可以使用plist文件或JSON文件将该数据存储在应用程序包中,并根据需要加载它(假设您不需要搜索它)。
然后,如果这些记录中的每一个都只有一个可由用户更改的boolean
值,那么这些值可以非常轻松地存储在NSUserDefaults
中(因为您已声明只是在处理有35-40个记录)。您可以使用id
将boolean
链接到数据文件。
您可以使用Core Data
或Realm
来存储数据,但如果您不需要搜索功能且用户无法更改文本,则可能过度杀伤。但是,如果您使用数据库选项,请注意您无法在iCloud备份的位置存储静态数据(文本),否则Apple将拒绝您的应用。无论您是否在应用程序中使用iCloud。因此,如果您要创建Core Data
持久性存储并将其保存到用户Documents
文件夹,然后加载所有静态数据,您将被拒绝。您可能希望将该数据存储保存在用户Cache
文件夹中,以便iCloud不备份它。之后您将遇到的问题是您希望用户选择备份boolean
值。这意味着他们需要存储在不同的地方。 Core Data
确实有一项功能,可让您创建Configurations
,将用户可更改数据与不可更改数据分开,但同样,这对您的案例来说太过分了。
对于这么小的数据集,我建议从Realm
开始'核心数据'。启动和运行起来要容易得多。
答案 1 :(得分:1)
如果您需要查看这些字段,CoreData是最好的方法,因为您可以使用NSPredicates
轻松访问您的数据,(就像SQL where
语句一样)。
但是如果你需要在每次启动时加载所有内容,你可以将所有内容存储到一个文件(plist,son ......),因为它更容易管理和更新(如果你更新CoreData Model,应用程序更新中的更改可能很复杂。
所以我的简短回答是:
如果你需要教你的数据=> 核心数据
Else => 本地存储上的文件
不要使用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,也许您需要一个不需要显示描述的浏览视图,因此您无需将描述文本加载到内存中。选择产品后,加载该产品的描述文件并在其中显示文本。
快乐编码:)