ios - 插入失败 : datatype mismatch

标签 ios objective-c database xml-parsing sqlite

当我在 NSLog 中显示我的数据时,它显示正确。但是当我解析数据并将其插入数组时,该数组显示错误排序的数据。在插入时,我在 HNM_Id 中得到了空值。所以我无法插入。问题出在哪里?

这是我使用的代码:

-(void)parseResponse:(NSData*)data{
   NSString *xmlStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"parseResponse Xml string %@",xmlStr);

    [sqliteManager deleteLoginDetails];

    TBXMLEx *xml = [TBXMLEx parserWithXML:xmlStr];


      if (xml.rootElement) {


        TBXMLElementEx *returnNode = xml.rootElement;

        TBXMLElementEx *fileNode = [returnNode child:@"AllHospitalNetwork"];

        while ([fileNode next]) {
            NSMutableArray* allHospitalNetwork = [NSMutableArray new];

            TBXMLElementEx *hospitalNetworkNode = [fileNode child:@"HospitalNetwork"];

            while ([hospitalNetworkNode next]) {
                NSMutableDictionary* hospitalNetwork = [NSMutableDictionary new];

                TBXMLElementEx *HNM_IdNode = [hospitalNetworkNode child:@"HNM_ID"];

                NSLog(@"HNM is %@",HNM_IdNode);

                if (HNM_IdNode) {
                    [hospitalNetwork setObject:HNM_IdNode.value forKey:@"HNM_ID"];

                    NSLog(@"HNM1 is %@",HNM_IdNode);

                    NSLog(@"HNM2 is %@",HNM_IdNode.value);
                }

                TBXMLElementEx *HNM_Network_NameNode = [hospitalNetworkNode child:@"HNM_Network_Name"];

                if (HNM_Network_NameNode) {
                    [hospitalNetwork setObject:[NSString stringWithFormat:@"%@",HNM_Network_NameNode.value] forKey:@"HNM_Network_Name"];
                }

                TBXMLElementEx *HNM_StatusNode = [hospitalNetworkNode child:@"HNM_Status"];

                if (HNM_StatusNode) {
                    [hospitalNetwork setObject:HNM_StatusNode.value forKey:@"HNM_Status"];
                }

                TBXMLElementEx *HNM_Created_DateNode = [hospitalNetworkNode child:@"HNM_Created_Date"];

                if (HNM_Created_DateNode) {
                    [hospitalNetwork setObject:HNM_Created_DateNode.value forKey:@"HNM_Created_Date"];
                }

                TBXMLElementEx *HNM_Created_ByNode = [hospitalNetworkNode child:@"HNM_Created_By"];

                if (HNM_Created_ByNode) {
                    [hospitalNetwork setObject:HNM_Created_ByNode.value forKey:@"HNM_Created_By"];
                }

                TBXMLElementEx *HNM_Modified_DateNode = [hospitalNetworkNode child:@"HNM_Modified_Date"];

                if (HNM_Created_ByNode) {
                    [hospitalNetwork setObject:HNM_Modified_DateNode.value forKey:@"HNM_Modified_Date"];
                }

                TBXMLElementEx *HNM_Modified_ByNode = [hospitalNetworkNode child:@"HNM_Modified_By"];

                if (HNM_Modified_ByNode) {
                    [hospitalNetwork setObject:HNM_Modified_ByNode.value forKey:@"HNM_Modified_By"];
                }

                [allHospitalNetwork addObject:hospitalNetwork];


                NSLog(@"allHospitalNetwork insert is %@ ",allHospitalNetwork);

            } 
                [sqliteManager insertHospitalNetwork:allHospitalNetwork];


        }

parseResponse Xml 字符串 NSLog:

<?xml version="1.0"?>
<AllLoginDetails>
  <AllHospitalNetwork>
    <HospitalNetwork>
      <HNM_ID>1</HNM_ID>
      <HNM_Network_Name>Health Care</HNM_Network_Name>
      <HNM_Status>A</HNM_Status>
      <HNM_Created_Date>24/06/2013 17:46:58</HNM_Created_Date>
      <HNM_Created_By>1</HNM_Created_By>
      <HNM_Modified_Date />
      <HNM_Modified_By />
    </HospitalNetwork>
    </AllHospitalNetwork>

但是数组值顺序改变了:

allHospitalNetwork insert is (
        {
        "HNM_Created_By" = 1;
        "HNM_Created_Date" = "24/06/2013 17:46:58";
        "HNM_ID" = 1;
        "HNM_Modified_By" = "";
        "HNM_Modified_Date" = "";
        "HNM_Network_Name" = "Health Care";
        "HNM_Status" = A;
    }

插入:

-(void)insertHospitals:(NSMutableArray*)hospitals{

 NSString* sqlStr = @"insert into Hospital_Master(\"HM_ID\",\"HM_HNM_ID\",\"HM_Hospital_Name\",\"HM_Status\",\"HM_Created_Date\",\"HM_Created_By\",\"HM_Modified_Date\",\"HM_Modified_By\")";


    for (NSDictionary* feedDict in hospitals) {
        if(i > 0){
            sqlStr = [sqlStr stringByAppendingString:@" UNION "];


        }


     sqlStr = [sqlStr stringByAppendingString:[NSString stringWithFormat:@" SELECT \"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\"",[feedDict objectForKey:@"HM_Id"] ,[feedDict objectForKey:@"HM_HNM_Id"],[feedDict objectForKey:@"HM_Hospital_Name"], [feedDict objectForKey:@"HM_Status"], [feedDict objectForKey:@"HM_Created_Date"],[feedDict objectForKey:@"HM_Created_By"],[feedDict objectForKey:@"HM_Modified_Date"],[feedDict objectForKey:@"HM_Modified_By"]]];


        i++;

    }

    char * sql =sqlite3_mprintf("%q",[sqlStr UTF8String]);

 sqlite3_exec(database, sql, 0, 0, 0);

    NSLog(@"Insert failed: %s", sqlite3_errmsg(database));

    sqlite3_free(sql);
}

插入失败:数据类型不匹配

最佳答案

你用了很多困难的方法来完成这个插入任务,实际上我不能完全理解你在做什么,但我为你提供了一个用于插入目的的模板..

在你的代码中,你没有准备查询语句,你直接执行查询,所以首先你应该正确准备语句,然后你可以执行...

这是模板,

sqlite3_stmt *statement;
NSString *insertSQL = [NSString stringWithFormat:@"insert into table_name (col_name_1, col_name_2, col_name_3) values(\"%@\",\"%d\",\"%d\")",variable_vale_1, variable_vale_2, variable_vale_3];
// Here i m assuming that first value is NSString type and other are integer type
    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(database_object, insert_stmt,-1, &statement, NULL);
    if (sqlite3_step(statement) != SQLITE_DONE)
    {
        NSLog(@"Statement is Failed.....");
    }
sqlite3_finalize(statement);

不要忘记完成您的陈述,并在提供实体的数据类型时要小心。

只需使用此模板安排您的代码,我希望它对您有用...

关于ios - 插入失败 : datatype mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21775836/

相关文章:

iphone - 核心数据 - GROUP BY

iphone - 如何在不丢失精度的情况下将 NSDecimalNumber 转换为 CLLocationDegrees?

mysql - 严重的 MySQL 性能问题(连接、临时表、文件排序……)

ios - [UI按钮设置文本:]: unrecognized selector sent to instance

objective-c - 除了弱/强舞蹈之外,还有什么方法可以在 block 中使用实例变量吗?

ruby - Redis 是否会为大量请求对 hset 命令进行排队?

python - 在Python中将CSV记录导入MySQL数据库

c# - 如何使用 Xamarin 在 iOS 13 中获取设备 token ?

ios - SpriteNode/Shapes 改变大小并在返回 GameScene 后消失(Swift SpriteKit)

ios - 扩展 UIApplicationDelegate 协议(protocol)