nyarudbにゃるものを使ってみた話 (+realm比較)

65
NyaruDB

Upload: masaki-oshikawa

Post on 02-Aug-2015

262 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NyaruDB

Page 2: NyaruDBにゃるものを使ってみた話 (+Realm比較)

@starfruits_j (Little Gleam)

Page 3: NyaruDBにゃるものを使ってみた話 (+Realm比較)

 Azione

Azione Web

Page 4: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Swift?!

Page 5: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Nator

© 2014 Azione Co.,Ltd. All Right Reserved.

Page 6: NyaruDBにゃるものを使ってみた話 (+Realm比較)

DB ( )SQL

Page 7: NyaruDBにゃるものを使ってみた話 (+Realm比較)

DB

Page 8: NyaruDBにゃるものを使ってみた話 (+Realm比較)

DB

typo

[NSString stringWithFormat:]

INDEX

Page 9: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SQLite(FMDB)

3GS

Page 10: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 11: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 12: NyaruDBにゃるものを使ってみた話 (+Realm比較)

FMDatabaseQueue

Page 13: NyaruDBにゃるものを使ってみた話 (+Realm比較)

REINDEX

Page 14: NyaruDBにゃるものを使ってみた話 (+Realm比較)

ALTER TABLE mails ADD COLUMN answered INTEGER DEFAULT ....

Page 15: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 16: NyaruDBにゃるものを使ってみた話 (+Realm比較)

...

Page 17: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SparrowOpenSource

Page 18: NyaruDBにゃるものを使ってみた話 (+Realm比較)

OSS !=

TokyoCabinet

Page 19: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 20: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NoSQL - SQL

..

Page 21: NyaruDBにゃるものを使ってみた話 (+Realm比較)

API ( )

NoJSON, NoARC NoIB

Page 22: NyaruDBにゃるものを使ってみた話 (+Realm比較)

main.m

int main(int argc, char *argv[])

{

@autoreleasepool {

if ([AppSettings isOS8OrGreater]) {

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MB2AppDelegate class]));

}

return UIApplicationMain(argc, argv, nil, NSStringFromClass([ScreenFactory class]));

}

}

Page 23: NyaruDBにゃるものを使ってみた話 (+Realm比較)

DB SQL

github

Page 24: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NyaruDBhttps://github.com/kelp404/NyaruDB

( )SAN ( )

W

2013 4 7 1:05

MIT License

NyaruDB is a simple NoSQL database in

Objective-C. It could be run on iOS and OS X.

It is a key-valu pair NoSQL database. You could

search data by fields of the document.

Page 25: NyaruDBにゃるものを使ってみた話 (+Realm比較)

DB

SQL

Page 26: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NyaruDB SQL

Page 27: NyaruDBにゃるものを使ってみた話 (+Realm比較)

CocoaPods

SQL

Page 28: NyaruDBにゃるものを使ってみた話 (+Realm比較)

_documentFilePath

_indexFilePath

NSFileHandle seek

Page 29: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 30: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Table keyselect

(asyncFetch)AsyncDisplayKit

Page 31: NyaruDBにゃるものを使ってみた話 (+Realm比較)

10

Page 32: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SQLKeyValueStore

NSDictionary NSDictionary

- (NSString *)name { return _dic[@"name"];}

- (void)setName:(NSString *)name { _dic[@"name"] = name;}

JSON OK

Page 33: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NyaruCollection *col = [[NyaruDB instance] collection:@"articles"];[col createIndex:@"user_id"];[col put:@{ @"user_id" : @1 @"name" : @"Cocoa", @"age" : @"test",}];

instance singletoncollection close instance

Page 34: NyaruDBにゃるものを使ってみた話 (+Realm比較)

JSON

- (instansetype)initWithDictionary:(NSDictionary *)dictionary { if ((self = [super init])) { _dic = dictionary; } return self;}

- (void)save { [self.col put:_dic];}

"key" primarykeykey update

Page 35: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SELECTNSArray *results = [[col all] fetch];

Page 36: NyaruDBにゃるものを使ってみた話 (+Realm比較)

WHERENSDictionary *result = [[col where:@"user_id" equal:identifier] fetchFirst];

Page 37: NyaruDBにゃるものを使ってみた話 (+Realm比較)

ANDwhere: => NyaruQuery

[[self.col where:@"user_id" less:100] and:@"user_id" greater:10]];

Page 38: NyaruDBにゃるものを使ってみた話 (+Realm比較)

NyaruQuery- (NyaruQuery *)and:(NSString *)indexName equal:(id)value;- (NyaruQuery *)and:(NSString *)indexName notEqual:(id)value;- (NyaruQuery *)and:(NSString *)indexName less:(id)value;- (NyaruQuery *)and:(NSString *)indexName lessEqual:(id)value;- (NyaruQuery *)and:(NSString *)indexName greater:(id)value;- (NyaruQuery *)and:(NSString *)indexName greaterEqual:(id)value;- (NyaruQuery *)and:(NSString *)indexName like:(NSString *)value;

- (NyaruQuery *)or:(NSString *)indexName equal:(id)value;- (NyaruQuery *)orderBy:(NSString *)indexName;- (NyaruQuery *)orderByDESC:(NSString *)indexName;

Page 39: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 40: NyaruDBにゃるものを使ってみた話 (+Realm比較)

 : JSON

NSNull nil

Page 41: NyaruDBにゃるものを使ってみた話 (+Realm比較)

limit length of field name is 255limit of documents is 4,294,967,295

limit of document file size is 4Gkey is unique and it is NSStringkey only provides equal search

key is case sensitiveindex is case insensitive

a field of the document should be same data typewhich is index

sort query allow only one

Page 42: NyaruDBにゃるものを使ってみた話 (+Realm比較)

http://realm.io/

Realm is a mobile database: a replacement forSQLite & Core Data Realm can save you

thousands of lines of code & weeks of work, andlets you craft amazing new user experiences.

Page 43: NyaruDBにゃるものを使ってみた話 (+Realm比較)

CocoaPods

SQL

RLMObject

Table Class

@interface User : RLMObject

@property (nonatomic, copy) NSString *identifier;

@property (nonatomic, copy) NSString *name;

@end

Page 44: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 45: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 46: NyaruDBにゃるものを使ってみた話 (+Realm比較)
Page 47: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SQL

Page 48: NyaruDBにゃるものを使ってみた話 (+Realm比較)

@interface User : RLMObject

@property (nonatomic, copy) NSString *identifier;

@property (nonatomic, copy) NSString *name;

@end

+ (NSString *)primaryKey {

return @"identifier";

}

Page 49: NyaruDBにゃるものを使ってみた話 (+Realm比較)

INSERT[[RLMRealm defaultRealm] transactionWithBlock:^{

[[RLMRealm defaultRealm] addObject:user];

[[RLMRealm defaultRealm] addOrUpdateObject:user];

}];

Page 50: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SELECTRLMResults *users = [User allObjects];

Page 51: NyaruDBにゃるものを使ってみた話 (+Realm比較)

RLMResultsNSArray (for in )

@interface RLMResults : NSObject<RLMCollection, NSFastEnumeration>

...

- (id)objectAtIndex:(NSUInteger)index;

- (id)firstObject;

- (id)lastObject;

...

@end

Page 52: NyaruDBにゃるものを使ってみた話 (+Realm比較)

WHEREUser *user = [[User objectsWhere:@"identifier = %@", identifier] firstObject];

NSPredicate NSPredicate

Page 53: NyaruDBにゃるものを使ってみた話 (+Realm比較)

ANDobjectsWhere: => RLMResults

[[User objectsWhere:@"age < %@", @(20)] objectsWhere:@"age > %@", @(2)]];

Page 54: NyaruDBにゃるものを使ってみた話 (+Realm比較)

RLMResults@interface Picture : RLMObject

@property (nonatomic, assign) BOOL isDeleted;

...

+ (RLMResults *)pictures {

return [self objectsWhere:@"isDeleted = 0"];

}

+ (RLMResults *)deletedPictures {

return [self objectsWhere:@"isDeleted = 1"];

}

+ (RLMResults *)myPictures {

RLMResults *res = [self pictures];

res = [res objectsWhere:@"user_id", [Account identifier]];

res = [res sortedResultsUsingProperty:@"created" ascending:NO];

return res;

}

Page 55: NyaruDBにゃるものを使ってみた話 (+Realm比較)

delete[[RLMRealm defaultRealm] transactionWithBlock:^{

[[RLMRealm defaultRealm] deleteObjects:[Picture myPictures]];

}];

Page 56: NyaruDBにゃるものを使ってみた話 (+Realm比較)

...

Page 57: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Migration [RLMRealm setSchemaVersion:9

withMigrationBlock:^(RLMMigration *migration, NSUInteger oldSchemaVersion) {

if (oldSchemaVersion < 8) {

[migration enumerateObjects:NSStringFromClass([Pictures class])

block:^(RLMObject *oldObject, RLMObject *newObject) {

newObject[@"updated"] = oldObject[@"created"];

}];

}

}];

schemaVersion

Page 58: NyaruDBにゃるものを使ってみた話 (+Realm比較)

[RLMRealm defaultRealm]DBDB

Page 59: NyaruDBにゃるものを使ってみた話 (+Realm比較)

notification_token = [[RLMRealm defaultRealm] addNotificationBlock:^(NSString *notification, RLMRealm *realm) { // code}];

NSMapTable token

Page 60: NyaruDBにゃるものを使ってみた話 (+Realm比較)

AppDelegate migrationViewController initWithCoder:NSURLJava

getter

Page 61: NyaruDBにゃるものを使ってみた話 (+Realm比較)

https://github.com/jstarfruits/BenchDB

normal single main (10,000)FMDB 00.24 49.194 00.617NyaruDB 29.02 17.890 59.186Realm 04.18 28.744 00.385

Page 62: NyaruDBにゃるものを使ってみた話 (+Realm比較)

SQLite

Realm NyaruDB SQL

NyaruDB - Realm - FMDB -

Page 63: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Realm

Page 64: NyaruDBにゃるものを使ってみた話 (+Realm比較)

Azione

azione.co.jp

Page 65: NyaruDBにゃるものを使ってみた話 (+Realm比較)