SQL select 语句相当于 plist 上的查询

发布于 2024-12-02 07:09:37 字数 3009 浏览 0 评论 0原文

我正在尝试找出对 plist 进行查询的最佳方法。因此,尝试使 sql 等价于“SELECT * FROM sometable WHERE somecol = someval AND someothercol = someotherval AND”...等等......使用 plist 作为 sql 表的等价物。来自 Ruby 和 mysql,对于一个简单的查询来说,这似乎是一大堆代码。结果按预期返回(至少在第一次运行时是这样,我没有对此进行严格测试),没有错误。

所以问题是:是否有一些简单的方法隐藏在文档中的某处,可以使这个不那么笨重? 如果不是更好的方法是什么?

EPFramework.m

// LOAD PLIST AND FILTER MULTIPLE TIMES
-(NSMutableArray *)loadPlistAndFilterMultipleTimes:(NSString *)plist ArrayOfKeys:(NSArray *)arrayOfKeys ArrayOfKeyValues:(NSArray *)arrayOfKeyValues
{

// set the array counts
int arrayOfKeysCount = [arrayOfKeys count];
int arrayOfKeyValuesCount = [arrayOfKeyValues count];

// initialize the array to return
NSMutableArray *arrayFilteredResults = [[[NSMutableArray alloc] init] retain];

// qualify the search
if(arrayOfKeysCount == arrayOfKeyValuesCount && arrayOfKeysCount > 0 && arrayOfKeyValuesCount > 0)
{

    // get the plist
    NSString *fullFileName = [NSString stringWithFormat:@"%@.plist", plist];
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:fullFileName];

    // put the plist records into an array
    NSArray *arrayOfDictionaryItemsInPlist = [[NSMutableArray alloc] initWithContentsOfFile:path];

    // load our dynamic array for mutability throughout the loops
    NSMutableArray *arrayFiltered = [[[NSMutableArray alloc] initWithArray:arrayOfDictionaryItemsInPlist] retain];

    // build an array of the final results to return
    for(int i=0; i < arrayOfKeysCount; i ++)
    {

        // initialize this loops search criteria
        NSString *key = [arrayOfKeys objectAtIndex:i];
        id value = [arrayOfKeyValues objectAtIndex:i];

        // set the filter
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", key, value];

        // filter the result
        arrayFilteredResults = [[[NSArray alloc] initWithArray:[arrayFiltered filteredArrayUsingPredicate:predicate]] retain];

    } 
} else {
    NSLog(@"arrOfKeys count does not match arrayOfKeyValues count"); // the search did not qualify
}


// return the results
return arrayFilteredResults;    

// release the allocated memory
[arrayFilteredResults release];     

}

IndexController.m

NSArray *arrayOfKeys = [NSArray arrayWithObjects:
                         [NSString stringWithString:@"recordset"],
                         [NSString stringWithString:@"ep_object_attribute_id"], 
                         nil];

NSArray *arrayOfKeyValues = [NSArray arrayWithObjects:
                             [NSString stringWithString:@"1778587279"], 
                             [NSNumber numberWithInt:133], 
                             nil];

NSMutableArray *arrayOfResult = [epFrameWork loadPlistAndFilterMultipleTimes:@"FormEntries" ArrayOfKeys:arrayOfKeys ArrayOfKeyValues:arrayOfKeyValues];
NSLog(@"arrayOfResult: %@", arrayOfResult);

I am trying to figure out the best approach for queries on a plist. Thus, attempting at making an sql equivalent to "SELECT * FROM sometable WHERE somecol = someval AND someothercol = someotherval AND ".... so on and soforth ... using a plist as the sql table equivalent. Coming from Ruby and mysql, this just seems like a lot of code for one simply query. The results come back as expected (at least at first run they did, I have not tested this rigorously) with no errors.

So here is the question: Is there some simple method hiding in the docs somewhere that would make this less clunky?
and if not what is a better approach?

EPFramework.m

// LOAD PLIST AND FILTER MULTIPLE TIMES
-(NSMutableArray *)loadPlistAndFilterMultipleTimes:(NSString *)plist ArrayOfKeys:(NSArray *)arrayOfKeys ArrayOfKeyValues:(NSArray *)arrayOfKeyValues
{

// set the array counts
int arrayOfKeysCount = [arrayOfKeys count];
int arrayOfKeyValuesCount = [arrayOfKeyValues count];

// initialize the array to return
NSMutableArray *arrayFilteredResults = [[[NSMutableArray alloc] init] retain];

// qualify the search
if(arrayOfKeysCount == arrayOfKeyValuesCount && arrayOfKeysCount > 0 && arrayOfKeyValuesCount > 0)
{

    // get the plist
    NSString *fullFileName = [NSString stringWithFormat:@"%@.plist", plist];
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:fullFileName];

    // put the plist records into an array
    NSArray *arrayOfDictionaryItemsInPlist = [[NSMutableArray alloc] initWithContentsOfFile:path];

    // load our dynamic array for mutability throughout the loops
    NSMutableArray *arrayFiltered = [[[NSMutableArray alloc] initWithArray:arrayOfDictionaryItemsInPlist] retain];

    // build an array of the final results to return
    for(int i=0; i < arrayOfKeysCount; i ++)
    {

        // initialize this loops search criteria
        NSString *key = [arrayOfKeys objectAtIndex:i];
        id value = [arrayOfKeyValues objectAtIndex:i];

        // set the filter
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", key, value];

        // filter the result
        arrayFilteredResults = [[[NSArray alloc] initWithArray:[arrayFiltered filteredArrayUsingPredicate:predicate]] retain];

    } 
} else {
    NSLog(@"arrOfKeys count does not match arrayOfKeyValues count"); // the search did not qualify
}


// return the results
return arrayFilteredResults;    

// release the allocated memory
[arrayFilteredResults release];     

}

IndexController.m

NSArray *arrayOfKeys = [NSArray arrayWithObjects:
                         [NSString stringWithString:@"recordset"],
                         [NSString stringWithString:@"ep_object_attribute_id"], 
                         nil];

NSArray *arrayOfKeyValues = [NSArray arrayWithObjects:
                             [NSString stringWithString:@"1778587279"], 
                             [NSNumber numberWithInt:133], 
                             nil];

NSMutableArray *arrayOfResult = [epFrameWork loadPlistAndFilterMultipleTimes:@"FormEntries" ArrayOfKeys:arrayOfKeys ArrayOfKeyValues:arrayOfKeyValues];
NSLog(@"arrayOfResult: %@", arrayOfResult);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

·深蓝 2024-12-09 07:09:37

这是 fmdb 的链接。应该快速拿起它,更快,你会得到一个真正的数据库,而不是用 plist 模拟数据库:)

https:/ /github.com/ccgus/fmdb

希望有帮助

Here's the link for fmdb. Should be quick to pick it up, be faster and you get a real database instead of simulating one with plists :)

https://github.com/ccgus/fmdb

Hope that helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文