【问题标题】:Insert failed: datatype mismatch插入失败:数据类型不匹配
【发布时间】:2014-02-14 09:45:03
【问题描述】:

当我在 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);
}

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

【问题讨论】:

    标签: ios objective-c database xml-parsing sqlite


    【解决方案1】:

    您正在使用非常艰难的方式来执行此插入任务,实际上我无法完全了解您在做什么,但我为您提供了以下模板用于插入目的..

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

    这是模板,

    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);
    

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

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

    【讨论】:

      【解决方案2】:

      我不知道这是什么语言,

      但请尝试在您创建 SQL 查询的地方使用以下代码。

      sqlStr stringByAppendingString:[NSString stringWithFormat:@" SELECT '%@','%@','%@','%@','%@','%@','%@','%@'",[feedDict objectForKey:@"HM_Id"] ,......

      【讨论】: