SQL select语句等效于plist上的查询

时间:2011-08-30 02:06:29

标签: iphone objective-c plist

我正在尝试找出针对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);

1 个答案:

答案 0 :(得分:2)

这是fmdb的链接。应该快速提取,更快,你得到一个真正的数据库,而不是用plists模拟一个:)

https://github.com/ccgus/fmdb

希望有所帮助