1

我一直在 .plist 和 sqlite3 数据库之间进行辩论,以保存一些我需要访问但不在 .plist/database 中操作的数据。这是我的问题。假设我想存储树木、花卉、灌木的高度和颜色,并且我希望每条信息都可以访问。下面与我想要的类似: 棕榈6 英尺 绿色柳树8 英尺 棕色灌木 常绿5 英尺 绿色五叶草2 英尺 黄色 玫瑰1 英尺 红色郁金香2 英尺 黄色

因此,如果我想单独访问 Tulips 下的 2 英尺高度并将其显示在我的应用程序的文本框中..使用的最佳数据存储/资源形式是什么。.plist 还是 sqlite?我将如何将其布置为 .plist?
一如既往,我感谢您的时间和努力!谢谢!

4

2 回答 2

1

由于您没有太多数据,只需使用 a.plist它会更容易管理

使每个父母 Trees,Flowers,Bushes 和 array 使每个子项成为一个 dictinary ,所以当您检查一个孩子是否满足您的要求时,就像2 feet height under Tulips 使用它一样。

创建一些像这样的plist:

在此处输入图像描述

代码示例:注意:我没有测试这个你需要改进这个

您可以在这里使用某种逻辑来检查颜色、种类或高度。

我从我的项目中给出一个示例,让您了解如何过滤 plist,因此可以根据需要更改函数的名称。

我不会更改函数名称,因为“没有人有时间”:) 创建一个名为 nsobject 的类ParseSchedulePlist

在 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);
于 2013-05-08T18:31:43.543 回答
0

您可以使用核心数据实现相同的目的。这样的核心数据会有点难以使用。我一直将它与 Magical Record 一起使用,这是一个很棒的图书馆。

用关系映射对象非常容易。在您的情况下,父母和孩子之间存在一对多和一对一的关系。

在此处输入图像描述

如果您想找到高度等于 2 的项目,请使用 MagicalRecord。您可以通过两个简单的步骤完成此操作

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"height =%@",@2];
NSArray *items = [Item findAllWithPredicate:predicate];

好消息是,由于项目与组之间存在一对一的关系,因此每个项目都会包含有关组的信息。因此,一切都非常适合,并且更容易搜索您喜欢的任何方式。

您可以找到源代码以获取详细信息。

于 2013-05-08T21:25:37.180 回答