2

複数のCGRectの座標とサイズを含むNSMutableArrayがあります。これをsqliteに保存したいと思います。配列全体を保存することは可能ですか?または、CGRectsをデータベースに手動で保存する必要がありますか?

アップデート:

これは私がデータベースから取得したデータです:

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

ご覧のとおり、これはCGRectの配列です。

4

1 に答える 1

3

わかりました。これはCoreDataを使用すると少し簡単になりますが、基本は同じです。アーカイブを使用して、配列データをNSDataオブジェクトに格納する必要があります。

NSData *dataFromArray = [NSKeyedArchiver archivedDataWithRootObject:myArray];

次に、そのデータをblobとしてデータベースに保存します。使用するSQLiteラッパーによっては、NSDataオブジェクトを取得してバイトに変換するメソッドがある場合があります。それ以外の場合は、次のコマンドで生のバイトを取得できます。

const char *arrayBytes = [dataFromArray bytes];

データを元に戻すには、データベースからNSDataオブジェクトにバイトを取得してから、アーカイブを解除します。BLOBをデータベースからdataFromDBというNSDataオブジェクトに取得できると仮定すると、次のようになります。

NSArray *myArrayFromDB = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromDB];

そして、あなたはあなたのアレイを取り戻すでしょう!

于 2012-07-24T01:56:23.420 に答える