1

現在コアデータを使用してデータベースからデータを取得し、テーブルビューにデータを入力するiOSアプリを維持しています。データベース全体をSQLCypherで暗号化する必要があるという新しい要件が出てきました。私の調査によると、CoreDataはサイファーとうまく連携することを拒否しています。そのため、coredataのサポートを削除し、データベースの呼び出しを手動で行う必要があることが決定されました。この場合、dbの相互作用を管理し、TableViewsとうまく連携するCoreDataのNSFetchedResultsの機能をエミュレートするライブラリ/プロジェクトはありますか?

私は、dbの相互作用を行うために、SQLステートメントが散らばっているコードの量を最小限に抑える方法でプロジェクトを設計するためのアドバイスを探しています。誰かがこれをどのように達成できるかについてアドバイスをいただけますか?

ありがとう

4

2 に答える 2

0

このソリューションは、コアデータを保持し、コンテンツの暗号化を提供するのに役立つ可能性があります。

MyDataという名前のCoreDataオブジェクトが1つの属性MyDataを持っているとしましょう。次に、CoreDataモデルでこの属性のプロパティtransientを設定します。次に、属性タイプBinaryDataを使用して2番目の属性MySecretDataを定義します。これは、実際のデータが保存される場所です。

次に、NSManagedObjectサブクラスに次のようなカテゴリを作成します。

@interface MyObject (Access)

- (NSData*)myData;
- (void)setMyData:(NSData*)value;

@end

@implementation MyObject (Access)

- (NSData*)MyData {
    NSMutableData * tmpValue;

    [self willAccessValueForKey:@"MyData"];
    tmpValue = [self primitiveValueForKey:@"MyData"];
    [self didAccessValueForKey:@"MyData"];

    if(!tmpValue) {
        NSData *encryptedData = [self valueForKey:@"MySecretData"];
        if(encryptedData) {            
            tmpValue = [NSMutableData dataWithData:encryptedData];
            BOOL success = [tmpValue decryptWithKey:nil];
            if (!success) {
                // Error Handling here
            }
            tmpValue = [tmpValue zlibInflate];
            [self setPrimitiveValue:tmpValue forKey:@"MyData"];
        }
        else {
            tmpValue = nil;
            [self setMyData:tmpValue];
        }
    }
    return tmpValue;
}

- (void)setMyData:(NSData *)data {
    NSData* tmpValue;
        [self willAccessValueForKey:@"MyData"];
        tmpValue = [self primitiveValueForKey:@"MyData"];
        [self didAccessValueForKey:@"MyData"];

        if([tmpValue isEqual:data])
        return;

        [self willChangeValueForKey:@"MyData"];
        [self setPrimitiveValue:data forKey:@"MyData"];
        [self didChangeValueForKey:@"MyData"];
        NSMutableData* encryptedData = nil;
        if (data != nil) {
            encryptedData = [NSMutableData dataWithData:data];
            encryptedData = [encryptedData zlibDeflate];
            BOOL success = [encryptedData encryptWithKey:nil];
            if (!success) {
                // Error Handling here
            }

        }
        [self setPrimitiveValue:encryptedData forKey:@"MySecretData"];
}

@end

この場合、データは暗号化され、収縮されます。コードから、通常どおりMyDataにアクセスできます。コアデータベース内では、すべての値が暗号化されます。もちろん、適切な暗号化機能を使用する必要があります。

于 2012-10-05T15:51:43.797 に答える
0

良い、簡単な答えはないと思います。いくつかの可能性:

  • iOSは、ファイルシステムを自動的に暗号化できます。これはCoreDataに対して透過的であり、ファイルにアクセスする前に、「ロック解除」されていることを確認する必要があります。明らかに、これはSQLCypherを使用しません(それが何であれ)
  • SQLCypherがどのように機能するかはわかりませんが、暗号化されたデータベースと通信する独自​​のNSPersistentStoreを作成できる可能性があります。これも、不可能かもしれませんが、CoreDataに対して透過的です。それはすべてSQLCypherがどのように機能するかに依存します
  • 独自のCoreDataのようなレイヤーを作成します。私の知る限り、これに似たものはありません...つまり、Appleが常に利用可能であるのに、なぜ自分で作成するのでしょうか(少なくとも、iOS3より上にあるものがある場合)

それはあなたがそれをどのように見ても、多くの仕事です。

于 2012-10-05T16:08:09.450 に答える