开发者

SQL select statement equivalent for query on plist

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 predicateWithForma开发者_C百科t:@"%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);


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜