2012-07-24 57 views
2

我有一個包含多個CGRects的座標和大小的NSMutableArray。我想把這個存儲到sqlite中。是否有可能存儲整個數組?還是應該將CGRects手動存儲在數據庫中?在Sqlite中存儲NSMutableArray

UPDATE:

這一個是我從數據庫中檢索數據:

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的代碼。我沒有把它放在數據庫中,因爲我只是想確保NSKeyedUnarchive的工作。那就是:

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}}" 
) 

正如你可以看到,這是CGRects的陣列。

+0

您使用的是核心數據嗎? – sgress454 2012-07-24 01:20:40

+0

嗯不,我直接訪問sqlite。 – 2012-07-24 01:21:55

+0

你可以發佈一個rectsArray的例子嗎? – sgress454 2012-07-24 04:10:30

回答

3

好的 - 這對於Core Data來說更容易一些,但基本是一樣的。您需要將數組數據存儲到使用存檔的NSData對象:

NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:myArray]; 

然後將數據保存在數據庫中的一個blob。根據您使用SQLite的包裝,它可能有一個方法,以NSData的對象,並將其翻譯成你一個字節,否則你可以得到的原始字節有:

const char *arrayBytes = [dataFromArray bytes]; 

來獲取數據回來了,你會得到將數據庫中的字節返回到NSData對象中,然後解壓縮它。假設你可以得到你的BLOB從數據庫中,並進入所謂dataFromDB的NSData對象,你會做什麼:

NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromDB]; 

而且你有你的陣列回來了!

+0

謝謝Scott!我會先試試這個,我會告訴你它是否工作。 – 2012-07-24 02:04:19

+0

我有一個問題,爲什麼我必須將NSData轉換爲字節?我可以直接將NSData完美地插入到sqlite中。它不同嗎? – 2012-07-24 02:20:47

+0

沒有。如果你的SQLite包裝器可以將NSData存儲到數據庫中,那麼你很好,可以跳過將它翻譯成字節的部分。我只提到它,以防你必須自己創建SQLite blob。 – sgress454 2012-07-24 02:27:22