Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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
Ios 在Sqlite中存储NSMutableArray_Ios_Sqlite_Nsmutablearray - Fatal编程技术网

Ios 在Sqlite中存储NSMutableArray

Ios 在Sqlite中存储NSMutableArray,ios,sqlite,nsmutablearray,Ios,Sqlite,Nsmutablearray,我有一个NSMutableArray,其中包含多个CGRect的坐标和大小。我想将其存储到sqlite中。是否可以存储整个阵列?或者我应该在数据库中手动存储CGRECT吗 更新: 这是我从数据库中检索到的数据: 62706c69 73743030 d4010203 04050817 18542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106 0754726f 6f748001 a3090a0f

我有一个NSMutableArray,其中包含多个CGRect的坐标和大小。我想将其存储到sqlite中。是否可以存储整个阵列?或者我应该在数据库中手动存储CGRECT吗

更新:

这是我从数据库中检索到的数据:

62706c69 73743030 d4010203 04050817 18542474 6f705824 6f626a65 63747358 24766572 
73696f6e 59246172 63686976 6572d106 0754726f 6f748001 a3090a0f 55246e75 6c6cd20b 
0c0d0e5a 4e532e6f 626a6563 74735624 636c6173 73a08002 d2101112 16582463 6c617373 
65735a24 636c6173 736e616d 65a31314 155e4e53 4d757461 626c6541 72726179 574e5341 
72726179 584e534f 626a6563 745e4e53 4d757461 626c6541 72726179 12000186 a05f100f 
4e534b65 79656441 72636869 76657208 11161f28 32353a3c 40464b56 5d5e6065 6e797d8c 
949dacb1 00000000 00000101 00000000 00000019 00000000 00000000 00000000 000000c3
它与我放入数据库之前的完全相同

守则:

这是我用来检查NSArray是否正在存档的代码。我还没有把它放到数据库中,因为我只是想确保NSKeyedUnrchive工作正常。这是:

    NSData *toData = [NSKeyedArchiver archivedDataWithRootObject:rectsArray];
    NSLog(@"The data %@", toData);
    NSArray *fromData = [NSKeyedUnarchiver unarchiveObjectWithData:toData];
    NSLog(@"The data %@", fromData);
toData
显示存档表单,而
fromData
完全不显示任何内容。为什么会这样

下面是一个
rectsArray
示例:

(
"NSRect: {{83.389008, 179.61432}, {8.775116, -10.616217}}",
"NSRect: {{83.389008, 179.61432}, {8.775116, -10.616217}}",
"NSRect: {{83.389008, 179.61432}, {8.775116, -10.616217}}",
"NSRect: {{96.085426, 179.61432}, {5.2029028, -10.616217}}",
"NSRect: {{101.28833, 179.61432}, {5.8532658, -10.616217}}",
"NSRect: {{107.1416, 179.61432}, {4.5525398, -10.616217}}",
"NSRect: {{115.61544, 179.61432}, {3.2518141, -10.616217}}",
"NSRect: {{115.61544, 179.61432}, {3.2518141, -10.616217}}",
"NSRect: {{118.86726, 179.61432}, {6.5036283, -10.616217}}",
"NSRect: {{118.86726, 179.61432}, {6.5036283, -10.616217}}"
)
正如您所看到的,它是一个CGRECT数组。

好的——这对于核心数据来说比较容易,但基本原理是一样的。您需要使用存档将阵列数据存储到NSData对象中:

NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:myArray];
然后将该数据保存为数据库中的blob。根据您使用的SQLite包装器,它可能有一个方法获取NSData对象并将其转换为字节,否则您可以使用以下方法获取原始字节:

const char *arrayBytes = [dataFromArray bytes];
要将数据取回,需要将数据库中的字节取回NSData对象,然后将其取消归档。假设您可以将blob从数据库中取出并放入名为dataFromDB的NSData对象中,您将执行以下操作:

NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromDB];

你会找回你的阵列

你在使用核心数据吗?嗯,没有。。我直接访问sqlite。你能发布一个rectsArray的示例吗?@ScottGress我在上面发布了数组。我不确定你是如何创建数组的,但当我使用NSMutableArray arrayWithObjects:将这些行中的每一行作为字符串对象(前缀为@)时,它工作正常。但是使用NSStringFromCGRect()序列化这些CgRect可能会更好,因为这样您就可以使用CGRectFromString()轻松地将它们取回。谢谢Scott!我会先试试这个,然后告诉你它是否有效。我有一个问题,为什么我要将NSData转换成字节?我可以直接将NSData插入sqlite。有什么不同吗?没有。如果您的SQLite包装器可以获取NSData并将其存储在数据库中,那么您就可以开始了,并且可以跳过将其转换为字节的部分。我只是在您必须自己创建SQLite blob的情况下提到它。NSKeyedUnachiver不起作用。我归档了NSArray,检查过了,很好。但当我尝试取消归档时,它返回一个空数组。你能告诉我为什么吗?我会检查来自SQLite数据库的NSData,以确保它得到了正确的数据。在放入数据库的NSData对象上尝试一个NSLog,然后在即将出来的对象上尝试另一个NSLog,看看它们是否相同。