Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Objective c 是否将NSURLSessionDataTask响应存储到SQLite数据库?_Objective C_Json_Ios7_Sqlite_Nsurlsessiondatatask - Fatal编程技术网

Objective c 是否将NSURLSessionDataTask响应存储到SQLite数据库?

Objective c 是否将NSURLSessionDataTask响应存储到SQLite数据库?,objective-c,json,ios7,sqlite,nsurlsessiondatatask,Objective C,Json,Ios7,Sqlite,Nsurlsessiondatatask,我的代码调用了HTTPpost调用远程服务器,并以JSON格式获取结果,我已经提取了这个JSON,但现在我需要将这些结果存储到SQLite。根据我的阅读,NSURLSessionDataTask是后台线程,所以我的困惑是,我应该调用SQL open并在completionHandler中插入(或者)是否有其他最佳实践来处理此类需求 编辑1 我更努力的一点是,在“completionHandler”中编写SQLite操作有效吗?“completionHandler”将被视为单独线程(执行Sessi

我的代码调用了
HTTP
post调用远程服务器,并以
JSON
格式获取结果,我已经提取了这个JSON,但现在我需要将这些结果存储到SQLite。根据我的阅读,
NSURLSessionDataTask
是后台线程,所以我的困惑是,我应该调用SQL open并在
completionHandler
中插入(或者)是否有其他最佳实践来处理此类需求

编辑1

我更努力的一点是,在“completionHandler”中编写SQLite操作有效吗?“completionHandler”将被视为单独线程(执行SessionDataTask)或主线程上的方法吗

编辑2

我也对CoreData相关解决方案持开放态度

任何帮助都将不胜感激

NSURL *loginUrl = [NSURL URLWithString:@"myurl"];
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:loginUrl];
request.HTTPMethod = @"POST";
NSString *ipData = [NSString stringWithFormat:@"uName=%@&pwd=%@",self.userName.text,self.userPwd.text];
request.HTTPBody = [ipData dataUsingEncoding:NSUTF8StringEncoding];


NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *jsonError) {
    NSLog(@"Inside post data task......");

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response;
    if(httpResp.statusCode == 200)
    {
        NSLog(@"Response succesfull.........");
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];

        if(!jsonError)
        {
            //No Json error
            NSString *uName = jsonDict[@"userName"];
            NSString *uID = jsonDict[@"uID"];
            //HOW CAN I INSERT THESE DETAILS TO SQLITE DB BEFORE CALLING SEGUE TO MOVE TO NEXT SCREEN?
            dispatch_async(dispatch_get_main_queue(), ^{
                  [self performSegueWithIdentifier:@"mysegueID" sender:self];
                });
            }
    }else
    {
        NSLog(@"Response is not succesfulll...");
    }
}];

[postDataTask resume];
很多人使用objective-c包装sqlite

对于NSURLSession,完成处理程序的块将在“委托队列”上执行(请参阅NSURLSession的delegateQueue属性)

只要遵循SQLite线程规则,在完成处理程序中执行SQLite是有效的。我再次推荐FMDB her,因为它为此提供了帮助。看

因此,您的示例如下所示:

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

NSURL *loginUrl = [NSURL URLWithString:@"myurl"];
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:loginUrl];
request.HTTPMethod = @"POST";
NSString *ipData = [NSString stringWithFormat:@"uName=%@&pwd=%@",self.userName.text,self.userPwd.text];
request.HTTPBody = [ipData dataUsingEncoding:NSUTF8StringEncoding];


NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *jsonError) {
    NSLog(@"Inside post data task......");

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response;
    if(httpResp.statusCode == 200)
    {
        NSLog(@"Response succesfull.........");
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];

        if(!jsonError)
        {
            //No Json error
            NSString *uName = jsonDict[@"userName"];
            NSString *uID = jsonDict[@"uID"];
            //HOW CAN I INSERT THESE DETAILS TO SQLITE DB BEFORE CALLING SEGUE TO MOVE TO NEXT SCREEN?
            [queue inDatabase:^(FMDatabase *db) {
                  NSDictionary *argsDict = @{ @"uName" : uName, @"uID" : uID};
                  [db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict];
            }];

            dispatch_async(dispatch_get_main_queue(), ^{
                  [self performSegueWithIdentifier:@"mysegueID" sender:self];
                });
            }
    }
    else
    {
        NSLog(@"Response is not succesfulll...");
    }
}];

[postDataTask resume];

SQLite数据库可以从应用程序中的任何线程访问。唯一的限制是SQLite不能容忍来自多个线程的同时访问(这里的“同时”适用于“事务”的持续时间,而不仅仅是对SQLite方法的调用的持续时间)


因此,您必须以某种方式确保永远不会同时访问。一个简单的方法是始终使用相同的线程(例如,主线程)进行访问。或者您可以实现“软”协议,这样您就知道两个操作不会同时尝试使用DB,因为它们在时间上是分开的。或者您可以在软件/OS中使用Objective-C锁或其他同步机制。

只是为了澄清,您需要的是直接SQL而不是CoreData,对吗?(顺便说一句,为什么?)!1) 我是iOS开发人员(来自Android背景),所以SQLite的SQL查询对我来说更容易。2) 我的应用程序不是SQLite密集型的,换句话说,只有一次插入数据,剩余时间为只读。希望它有意义。CoreData确实有一些优势,即使对于简单的SQL使用也是如此。我发现这个链接有助于解释原因。迁移到未来的模式版本就是一个很好的例子。谢谢你,我会调查的@RobP。我的数据模型并不复杂,所以切换到核心数据对我来说不是什么大问题。如果您有核心数据解决方案,请随时回答此问题。谢谢您的回答!我更纠结的一点是,在“completionHandler”中编写SQLite操作(使用原始SQL(或任何框架)有效吗?“completionHandler”将被视为单独的线程(正在执行SessionDataTask)还是主线程?你能帮我回答这些问题吗?好的。知道了。非常感谢。