Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 快速访问核心数据数据库信息?_Iphone_Ios_Core Data_Nsfetchrequest - Fatal编程技术网

Iphone 快速访问核心数据数据库信息?

Iphone 快速访问核心数据数据库信息?,iphone,ios,core-data,nsfetchrequest,Iphone,Ios,Core Data,Nsfetchrequest,我有一个带核心数据的iOS应用程序,在我的一个函数中,我加载信息,以这种方式显示我的应用程序的一个视图: NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyDate" inManagedObjectContext:manag

我有一个带核心数据的iOS应用程序,在我的一个函数中,我加载信息,以这种方式显示我的应用程序的一个视图:

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帖子