无法在 plist 和 sqlite3 之间确定
Posted
技术标签:
【中文标题】无法在 plist 和 sqlite3 之间确定【英文标题】:Cannot determine between plist and sqlite3 【发布时间】:2013-05-08 18:09:20 【问题描述】:我一直在 .plist 和 sqlite3 数据库之间进行辩论,以保存一些我需要访问但不在 .plist/数据库中操作的数据。这是我的问题。假设我想存储树木、花卉、灌木的高度和颜色,并且我希望每条信息都可以访问。以下类似于我想要的:树木 棕榈 6英尺绿色柳树 8英尺棕色灌木 常绿 5 英尺绿色 Cinquefoil 2 英尺黄色 鲜花 玫瑰 1 英尺红色 郁金香 2 英尺黄色
因此,如果我想单独访问 Tulips 下的 2 英尺高度并将其显示在我的应用程序的文本框中..使用的最佳数据存储/资源形式是什么。 .plist 还是 sqlite?我将如何将其布局为 .plist? 一如既往,我感谢您的时间和努力! 谢谢!
【问题讨论】:
数据有多大? 10 000 棵树开花还是只有数百棵? 感谢您的回复。它不会太大。我知道 .plist 是事先加载的,这可能是个问题。我在 MAX 想每个 50 个左右。 我有一个包含大约 1000 个项目的列表。我使用了 plist 并且不后悔我的决定。实施起来很简单。 听起来像 .plist 是要走的路。我只是不知道如何布置它。树、灌木和花会成为他们自己的字典吗? 如果您不打算更新存储的数据。最简单的是 plist。如果有频繁的更新,sqlite会更好。 【参考方案1】:由于您没有太多数据,只需使用.plist
会更容易管理
让每个父级 Trees,Flowers,Bushes 和 array 使每个子项成为一个 dictinary ,因此当您检查一个子项是否满足您的要求时,例如 2 feet height under Tulips
使用它。
像这样创建一些 plist:
代码示例: 注意:我没有测试这个你需要改进这个
您可以在这里使用某种逻辑来检查颜色、种类或高度。
我从我的项目中给出一个示例,让您了解如何过滤 plist,因此可以根据需要更改函数的名称。
我不会更改函数名称,因为“没有人有时间”:)
创建一个名为ParseSchedulePlist
的nsobject类
在 ParseSchedulePlist .h 中
#import <Foundation/Foundation.h>
@interface ParseSchedulePlist : NSObject
@property (nonatomic,strong) NSMutableDictionary * agendaDic;
- (void)passStringToAgendaDic:(NSString *)string;
//trees
-(NSArray*)getTrees;
-(NSDictionary*)getItems:(NSInteger ) section ;
-(NSString*)getItemKind :(NSInteger ) section;
-(NSString*)getItemColor :(NSInteger ) section;
-(NSNumber*)getItemheight :(NSInteger ) section;
//flowers
//do the same of above for flowers an bushes took
@end
在 ParseSchedulePlist .m 中
#import "ParseSchedulePlist.h"
@implementation ParseSchedulePlist
@synthesize agendaDic = _agendaDic;
- (void)passStringToAgendaDic:(NSString *)string
//get plist from bundle
NSString * path = [[NSBundle mainBundle] pathForResource:string ofType:@".plist"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
NSLog(fileExists ? @"Yes" : @"No");
NSLog(@"Path is %@",path);
NSLog(@"agendaDic is %u",[self.agendaDic count]);
self.agendaDic = [NSMutableDictionary dictionaryWithContentsOfFile:path];
-(NSArray*)getTrees
NSArray * value = [[self agendaDic] objectForKey:@"trees"];
return value;
-(NSDictionary*)getItems:(NSInteger ) section
NSDictionary * value =[[self getTrees] objectAtIndex:section];
return value;
-(NSString*)getItemKind :(NSInteger ) section;
NSString * value =[[[self getItems] objectAtIndex:section] objectForKey:@"kind"];
return value;
-(NSString*)getItemColor :(NSInteger ) section
NSString * value =[[[self getItems] objectAtIndex:section] objectForKey:@"color"];
return value;
-(NSNumber *)getItemheight :(NSInteger ) section;
NSNumber * value =[[[self getItems] objectAtIndex:section] objectForKey:@"height"];
return value;
//write the same functions for flowers and bushes
@end
在您的常规视图控制器 .h 中:
#import "ParseSchedulePlist .h"
@property (nonatomic, strong) ParseSchedulePlist *agenda;
在您的常规视图控制器 .m 中:
#import "ParseSchedulePlist .h"
@synthesize agenda;
//here calls for the special class
self.agenda=[[ParseSchedulePlist alloc] init];
[self.agenda passStringToAgendaDic:@"name of the plist"];
NSMutableArray *newArray=[ NSMutableArray alloc] init];
//here for example get all the palm trees under 6 feet
for(int i=0; i<[self.agenda getTrees] count] i++)
if([self.agenda getItemKind :i] isquealtostring @"palm")
if([self.agenda getItemheight :i] <= 6)
[newArray add object:[self.agenda getItems:i];
Nslog(@"print your array %@",newArray);
【讨论】:
+1 努力创建 plist。但又是一个疑问,您将如何过滤孩子?你能澄清一下吗? @Anupdas 正在努力,很快会用示例代码更新我的答案 你是说访问每个数组下的子数据会有问题吗? @SpaceDust 请慢慢来。同时我会尝试用 sqlite 来做,有两个表。如果核心数据在图片中,那将是小菜一碟。 我并不完全反对使用核心数据。我只是没有太多经验。如何使用 Core Data 进行布局?【参考方案2】:您可以使用核心数据实现相同的目的。这样的核心数据会有点难以使用。我一直将它与 Magical Record 一起使用,这是一个很棒的图书馆。
用关系映射对象非常容易。在您的情况下,父母和孩子之间存在一对多和一对一的关系。
如果您想找到高度等于 2 的项目,使用 MagicalRecord。您可以通过两个简单的步骤完成此操作
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"height =%@",@2];
NSArray *items = [Item findAllWithPredicate:predicate];
好消息是,由于项目与组之间存在一对一的关系,因此每个项目都会包含有关组的信息。因此,一切都非常合适,并且可以更轻松地搜索您喜欢的任何方式。
您可以找到source code 了解详情。
【讨论】:
很好的例子,感谢您抽出宝贵的时间。我需要进行更多研究并更加熟悉核心数据,因为它似乎对很多事情都有好处 @hansoac 你应该通过放弃投票来感谢我;)。顺便说一句,我分别使用了 groupID 和 itemID,因为它使 MagicalRecord 的使用变得非常容易。 我最初尝试这样做。但是,我距离能够这样做还有 2 个声望点:/ 如此接近!有什么建议可以再拿 2 分吗?哈哈 @hansoac 没关系,您至少需要 10 分才能投赞成票。以上是关于无法在 plist 和 sqlite3 之间确定的主要内容,如果未能解决你的问题,请参考以下文章