LIFULL Creators Blog

「株式会社LIFULL(ライフル)」の社員によるブログです。

Couchbase LiteでCreateとReadをしよう。

さて、前回ビルドまで完了したので、今回は早速、データの作成、保存。
そして読み込みをやってみましょう。

CouchbaseLiteは、JSONドキュメントが基本です。
なので、データ自体も連想配列形式で作成します。というわけでNSDictionary形式でデータを作ります。


ViewController.mに以下のコードを追加していきます。

ドキュメント作成

流れ的には以下のようになります。

1.連番を作る
※CouchbaseLiteにはドキュメントを表すユニークなIDを作る機能はありますが、連番を作る機能はありません。
2.新規にのドキュメントを作成する
3.ドキュメントをデータベースにPutする

// 新規ドキュメントの作成
- (void)createDocument{
    // Appdelegateを呼ぶ
    AppDelegate *ap = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   
    // カウントの読み込み
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
   
    // カウントが0だったら1にする
    // ※連番を作る機能がないので、ここで作成する
    int num = [userDefault integerForKey:NUMBER_KEY];
    if (num == 0) {
        num = 1;
    }
   
    // カウント文字列の作成
    NSString *numberStr = [NSString stringWithFormat:@"%d",num];
   
    // ドキュメントを追加
    NSDictionary *contents =
    @{@"text"       : numberStr,
      @"check"      : [NSNumber numberWithBool:NO],
      @"created_at" : [CBLJSON JSONObjectWithDate: [NSDate date]]};
   
    // 無記名ドキュメントの取得
    CBLDocument* doc = [ap.database untitledDocument];
   
    // ドキュメントの追加
    NSError* error;
    if (![doc putProperties: contents error: &error]){
        // 失敗したらアラートを表示
        [self showErrorAlert: @"Couldn't save the new item"];
    }
    else{
        // 成功したらカウントを上げる
        NSLog(@"Save Complete!");
        ++num;
        // ユーザデフォルトのに保存
        [userDefault setInteger:num forKey:NUMBER_KEY];
        [userDefault synchronize];
       
    }
}

// 失敗時のアラート表示
- (void)showErrorAlert:(NSString *)message{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:message
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil, nil];
    [alert show];
} 
CBLDocument:

ひとつのデータを指します。一枚のJSONと考えて貰えれば一番わかりやすいかと。
ドキュメントそれ自体ではあるが、自身の保存、更新、削除機能もこのオブジェクトに入っています。

ここで注意する点は、databaseを使ってカラのドキュメントを作成する点です。
普通に考えると、CBLDocumentをnewすればいいんじゃ?となりますが、CBLDocumentそれ自体がPutする機能を持っておりかつ、CBLDocumentのdatabaseプロパティはReadOnlyなので後からセットすることができません。
なので、databaseと関連付けるためにdatabaseを使ってCBLDocumentを作成するというわけです。

余談:はじめDocument作って、Databaseに渡すという構図を想像してたのでチョビっとハマりました。

ドキュメントの読み込み

そして次に、読み込みをしてみます。
コードは以下のようになります。

1.データを保管するArrayを作成
2.すべてのデータを読み込むQueryを作成
3.Arrayに取得したドキュメントを追加

@implementation ViewController
{
    NSMutableArray  *dataArray; //CBLデータを格納するArray

}

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    // 格納配列の初期化
    dataArray = [[NSMutableArray alloc] init];   

    //Documentを作成
    [self createDocument];
    // すべてのDocumentを読み出す
    [self loadAllDocuments]; 
}


- (void)loadAllDocuments{
    AppDelegate *ap = ApplicationDelegate;
   
    // ArrayをClear
    [dataArray removeAllObjects];
   
    // すべてのクエリを読み込む
    CBLQuery *allQuary = [ap.database queryAllDocuments];
   
    for (CBLQueryRow* row in allQuary.rows) {
        // document取得
        CBLDocument* doc        = [ap.database documentWithID: row.key];
        NSDictionary* contents  = doc.properties;
        // data 追加
        [dataArray addObject:contents];
    }
   
    // 時間順に並び替えをする
    NSSortDescriptor *sortDispNo    = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:NO];
    NSArray *sortDescArray          = [NSArray arrayWithObjects:sortDispNo, nil];
   
    [dataArray setArray:[dataArray sortedArrayUsingDescriptors:sortDescArray]];

    NSLog(@"%@", dataArray); 
   
} 
CBLQuery

CouchbaseLiteを操作するQueryオブジェクト。
データベースで言うと、このオブジェクトにSQLを渡せばその結果がこのオブジェクト内に生成されます。
後に出てくるView機能などもこのCBLQueryを利用します。

ここでは、予め実装されている全ドキュメントを呼び出すクエリ「queryAllDocuments」を使って、全ドキュメントを取得するCBLQueryを作成しています。

CBLQueryRow

CBLQuery内には、rowsというプロパティ内にクエリの結果が生成されておりその中のエンティティ的な立ち位置。


これらを実行すると、コンソールに今データベースに入っているドキュメントデータが表示されます。
起動時に1度しか追加していないので、1個しか出ないかと思います。
たくさん表示したい場合は何度か起動するか、for文でも作って回して貰えれば。

ここまでくれば、データはNSDictionaryが入ったArrayになっています。
Arrayに入っちゃえばもうこっちのもん!好き勝手利用できるようになります。やったね!


では今日はこれくらいで、次回には削除、更新をしようと思います。