Iphone 快速访问核心数据数据库信息?
我有一个带核心数据的iOS应用程序,在我的一个函数中,我加载信息,以这种方式显示我的应用程序的一个视图:Iphone 快速访问核心数据数据库信息?,iphone,ios,core-data,nsfetchrequest,Iphone,Ios,Core Data,Nsfetchrequest,我有一个带核心数据的iOS应用程序,在我的一个函数中,我加载信息,以这种方式显示我的应用程序的一个视图: NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyDate" inManagedObjectContext:manag
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"MyDate" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
if ([[[info valueForKey:@"status"] description] isEqualToString:@"Done"]) {
NSArray *allTask = [[info valueForKey:@"taskes"] allObjects];
for (NSManagedObject *task in allTask) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
if (IsDateBetweenInclusive([task valueForKey:@"firstDate"], fromDate, toDate)) {
[taskArray addObject:task];
}
}
}
}
因此,我迭代所有数据库以查找信息,然后显示它,当我的数据库中的信息较少时,上述方法是快速的,但当我的数据库中的信息较多时,在我的3GS上需要几秒钟来显示该视图,而在模拟器中则是快速的,因此我的问题是,有一种快速的方法,从核心日期获取信息?我不知道有一个关于属性和我想从核心数据中检索的值的快速调用
谢谢使用NSPredicate,请参阅
下面的代码将只获取状态字段设置为“完成”的值
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyDate" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"status == 'Done'"]];
NSError *error;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
创建
数据库
:
NSString*docsDir;
NSArray*dirpath
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"newapp.sqlite"]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
char *errMsg;
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS LIST (id VARCHAR, title VARCHAR , description VARCHAR ,date VARCHAR)";
if ((sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) )
{
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Failed to create table" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
sqlite3_close(contactDB);
} else {
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Failed to open/create database" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
插入值
NSString*id_str=@“21”;
NSString*title=@“notisa”;
NSString*description=@“新应用程序”;
NSString*日期=@“21/4/30”
选择数据库:
const char*dbpath=[databasePath UTF8String];
sqlite3_stmt*语句
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"SELECT id,title,description,date FROM LIST"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(@"ROW-->%d",SQLITE_ROW);
const char* policyNo = (const char *)sqlite3_column_text(statement, 1);
NSString *PolicyNumber = policyNo == NULL ? nil : [[NSString alloc]initWithUTF8String:policyNo];
NSLog(@"PolicyNumber:%@",PolicyNumber);
const char* start = (const char *)sqlite3_column_text(statement, 2);
NSString *startDate = start == NULL ? nil : [[NSString alloc]initWithUTF8String:start];
const char* end = (const char *)sqlite3_column_text(statement, 3);
NSString *endDate = end == NULL ? nil : [[NSString alloc]initWithUTF8String:end];
}
sqlite3_finalize(statement);
}
sqlite3_close(contactDB);
}
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"DELETE id,title,description,date FROM LIST"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(@"ROW-->%d",SQLITE_ROW);
const char* policyNo = (const char *)sqlite3_column_text(statement, 1);
NSString *PolicyNumber = policyNo == NULL ? nil : [[NSString alloc]initWithUTF8String:policyNo];
NSLog(@"PolicyNumber:%@",PolicyNumber);
const char* start = (const char *)sqlite3_column_text(statement, 2);
NSString *startDate = start == NULL ? nil : [[NSString alloc]initWithUTF8String:start];
const char* end = (const char *)sqlite3_column_text(statement, 3);
NSString *endDate = end == NULL ? nil : [[NSString alloc]initWithUTF8String:end];
}
sqlite3_finalize(statement);
}
sqlite3_close(contactDB);
}
删除:
const char*dbpath=[databasePath UTF8String];
sqlite3_stmt*语句
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"SELECT id,title,description,date FROM LIST"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(@"ROW-->%d",SQLITE_ROW);
const char* policyNo = (const char *)sqlite3_column_text(statement, 1);
NSString *PolicyNumber = policyNo == NULL ? nil : [[NSString alloc]initWithUTF8String:policyNo];
NSLog(@"PolicyNumber:%@",PolicyNumber);
const char* start = (const char *)sqlite3_column_text(statement, 2);
NSString *startDate = start == NULL ? nil : [[NSString alloc]initWithUTF8String:start];
const char* end = (const char *)sqlite3_column_text(statement, 3);
NSString *endDate = end == NULL ? nil : [[NSString alloc]initWithUTF8String:end];
}
sqlite3_finalize(statement);
}
sqlite3_close(contactDB);
}
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"DELETE id,title,description,date FROM LIST"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(@"ROW-->%d",SQLITE_ROW);
const char* policyNo = (const char *)sqlite3_column_text(statement, 1);
NSString *PolicyNumber = policyNo == NULL ? nil : [[NSString alloc]initWithUTF8String:policyNo];
NSLog(@"PolicyNumber:%@",PolicyNumber);
const char* start = (const char *)sqlite3_column_text(statement, 2);
NSString *startDate = start == NULL ? nil : [[NSString alloc]initWithUTF8String:start];
const char* end = (const char *)sqlite3_column_text(statement, 3);
NSString *endDate = end == NULL ? nil : [[NSString alloc]initWithUTF8String:end];
}
sqlite3_finalize(statement);
}
sqlite3_close(contactDB);
}
查看NSPredicate,无需手动遍历数据库谢谢!现在工作得更快了:),如果我以这种方式在另一个nsmutablearray中提供fecthedObjects数组,我还有一个问题:[task addObjectsFromArray:fetchedObjects];然后我就可以释放FetchedObject数组了?您没有为NSArray执行alloc。在这种情况下,发布将导致错误。很抱歉,我有最后一个问题,如何使用NSPredicate检索关系的所有元素?正如您在我上面的问题中所看到的,任务是来自另一个实体的关系…尚未使用与核心数据的关系,但请查看其中一些SO帖子