Nurseryとは、Cocoaフレームワーク向けのオブジェクト指向データベース(OODB)です。 フレームワークとして開発しているので、アプリケーションに組み込む形で利用できます。
QiitaにNurseryの基本的な使い方を紹介する一連の記事を投稿してます。
ライセンスは、zlibですので、商用・非商用のどちらでも利用できます。
以下のサービスで寄付を受け付けています:
- シンプルかつパワフル
- ほぼ全てをObjective-Cで記述
- FoundationフレームワークとCore Foundationフレームワーク(ソケット作成のため)のみで実装
- ACID準拠
- 遅延読み込み
- データベースファイル内のガベージコレクションとコンパクション
- 複数プロセスからの同時使用
- ORMではない
- NULibrary B+木を実装したコレクションクラス
- NUCoding プロトコルを実装したクラス
- NUCoder のサブクラスを使って永続化処理を実装したクラス
- NSObject
- NSString
- NSMutableString
- NSArray
- NSMutableArray
- NSDictionary
- NSMutableDictionary
- NSSet
- NSMutableSet
- NSNumber
- NSDate
- NSURL
- NSData
- NSMutableData
- NSIndexSet
- NSMutableIndexSet
#import <Nursery/Nursery.h>
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:@"path/to/file"];
NUGarden *aGarden = [aNursery makeGarden];
[aGarden setRoot:@"Hi, I'm Nursery"];
[aGarden farmOut];
#import <Nursery/Nursery.h>
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:@"path/to/file"];
NUGarden *aGarden = [aNursery makeGarden];
Person *aPerson = [Person new];
[aPerson setFirstName:@"Akifumi"];
[aPerson setLastName:@"Takata"];
[aGarden setRoot:aPerson];
[aGarden farmOut];
// Person Class
@interface Person : NSObject <NUCoding>
{
NSString *firstName;
NSString *lastName;
}
@property (weak) NUBell *bell;
- (NSString *)firstName;
- (void)setFirstName:(NSString *)aFirstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)aLastName;
@end
@implementation Person
+ (BOOL)automaticallyEstablishCharacter
{
return YES;
}
+ (void)defineCharacter:(NUCharacter *)aCharacter on:(NUGarden *)aGarden
{
[aCharacter addOOPIvarWithName:@"firstName"];
[aCharacter addOOPIvarWithName:@"lastName"];
}
- (void)encodeWithAliaser:(NUAliaser *)anAliaser
{
[anAliaser encodeObject:firstName forKey:@"firstName"];
[anAliaser encodeObject:lastName forKey:@"lastName"];
}
- (instancetype)initWithAliaser:(NUAliaser *)anAliaser
{
self = [super init];
if (self)
{
firstName = [anAliaser decodeObjectForKey:@"firstName"];
lastName = [anAliaser decodeObjectForKey:@"lastName"];
}
return self;
}
- (NSString *)firstName
{
return NUGetIvar(&firstName);
}
- (void)setFirstName:(NSString *)aFirstName
{
NUSetIvar(&firstName, aFirstName);
[[self bell] markChanged];
}
- (NSString *)lastName
{
return NUGetIvar(&lastName);
}
- (void)setLastName:(NSString *)aLastName
{
NUSetIvar(&lastName, aLastName);
[[self bell] markChanged];
}
@end
macOS (10.13 以上)
- プロジェクトページの"Open with Xcode"ボタンをクリックして、デスクトップ等にクローンする
- Xcodeのメニューバーの"Product"から"Build"を選択する
インスタンス変数はエンコーディング時にビッグエンディアンに変換され、デコード時にホストのエンディアンに変換されます
オブジェクトの読み込みと保存は、そのオブジェクトのエンコード/デコード時に呼び出されるメソッドがスレッドセーフである限り、スレッドセーフです。
Nursery は複数プロセスからの同時使用をサポートしています
Nursery は write-ahead ロギング (WAL)を実装しています
- Nursery のルートオブジェクトから到着できないオブジェクトは、GCによって自動的に解放されます
- 循環参照を適切に取り扱えます
- GCのアルゴリズムには3色マーキングを採用しています
- 解放された領域はコンパクト化されます
バグ修正歓迎です