在SQLite中保存NSArray并检索它

时间:2014-02-25 12:29:36

标签: ios objective-c sqlite nsarray nsdata

在我的iPHone应用程序中,我在这样的sqlite中保存了一个NSArray。

-(void)saveData

 NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:MyArray];



   sqlite3_stmt    *statement;
   const char *dbpath = [databasePath UTF8String];

   if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
   {
      NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO ARRAY(PROFILE) VALUES (\"%@\")",dataFromArray];


    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog(@"Saved Succesfully");

       }
     else {
        // NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(contactDB));
        NSLog(@"Not saved %d",sqlite3_finalize(statement));
       }
      sqlite3_finalize(statement);
      sqlite3_close(contactDB);
    }

  }

数据已成功保存。

现在我尝试像这样获取保存的数据 -

 -(void)fetchData{

  const char *dbpath = [databasePath UTF8String];
  sqlite3_stmt    *statement;

  if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
  {
    NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM ARRAY"];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        while(sqlite3_step(statement) == SQLITE_ROW)
        {
            NSString *MYstring = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];


             NSData* data = [MYstring dataUsingEncoding:NSUTF8StringEncoding];

            NSLog(@"data---%@",data);


           NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:data];



           }
          sqlite3_finalize(statement);
         }
          sqlite3_close(contactDB);
        }

     }

我正在获得像这样的“MYstring”的打印值

<62706c69 73743030 d4000100 02000300 04000500 0806cb06 cc542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d100 06000754 726f6f74 8001af11 022a0009 000a0017 00180019 001a0080 00810082 00830084 00850086 00870088 0089008a 008b008c 008d008e 008f0090 00910092 00930094 00950096 00970098 0099009a 009b009c 009d009e 009f00a0 00a100a2 00a300a4 00a500a6 00a700a8 00a900aa 00ab00ac 00ad00ae 00af00b0 00b100b5 00bd00c0 00c300c6 00c900cc 00cf00d2 00d500d8 00db00de 00e100e4 00e700ea 00ed00f0 00fd0105 0108010b 010e0111 01140117 011a011d 01200122 0127012a 012d0130 01330136 0139013c 013f0142 01450148 014b014e 01510154 0159015e 01610164 0169016f 018101a1 01a201a3 01a401a5 01a601a7 01a801a9 01aa01ab 01ac01ad 01ae01af 01b201b5 01b801bb 01be01c1 01c401c7 01ca01cd 01d001d3 01d601d9 01f901fa 01fb01fc>

但是当我尝试使用NSKeyedUnarchiver从数据创建NSArray时 - 应用程序崩溃显示此错误

   -[__NSCFData objectForKey:]: unrecognized selector sent to instance

我在哪里弄错了? 请帮我检索保存的数组,提前致谢。

2 个答案:

答案 0 :(得分:0)

为什么使用NSData?收到字符串后,写下行

NSArray *myArrayFromDB = [MYstring componentsSeparatedByString:@","];

如果它正常工作,请尝试此操作。如果没有,请告诉我,我找到另一种解决方案

答案 1 :(得分:0)

NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:myArray];

这将创建myArray的XML表示形式并将其放在dataFromArray中。像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="1.0">
<array>
    <string>It is a tale told by an idiot,</string>
    <string>Full of sound and fury, signifying nothing.</string>
</array>
</plist>

XML转换为UTF8格式并存储在NSData对象中。

当你这样做时:

NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO ARRAY(PROFILE) VALUES (\"%@\")",dataFromArray];

stringWithFormat操作解释格式字符串。当它看到%@时,它会认为“我必须从参数列表中获取下一个对象引用,对它应用description方法,并将其放入字符串中。”

NSData的description方法获取<?xml version...数据并将其转换为可显示的十六进制(因为description旨在纯粹用于调试,而不是“真正的”代码)。可显示的十六进制格式为8个字符的组,由空格分隔并括在“&lt;&gt;”中字符。到目前为止,数据已经无可救药地出现乱码,你甚至还没有将它插入到数据库中。