亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

淺談Realm數(shù)據(jù)庫及其使用

liuhh / 2486人閱讀

摘要:介紹是一個(gè)跨平臺(tái)移動(dòng)數(shù)據(jù)庫引擎,支持和以及。添加的屬性必須是支持的基本數(shù)據(jù)類型或繼承于類型。通過查詢通過斷言查找到年的運(yùn)動(dòng)記錄可看作是數(shù)組修改數(shù)據(jù)通過方法將本次運(yùn)動(dòng)數(shù)據(jù)添加到今天運(yùn)動(dòng)記錄。同理,通過刪除數(shù)據(jù)。會(huì)自動(dòng)進(jìn)行數(shù)據(jù)結(jié)構(gòu)調(diào)整。

1.Realm介紹
realm是一個(gè)跨平臺(tái)移動(dòng)數(shù)據(jù)庫引擎,支持iOS、OS X(Objective-C和Swift)以及Android。目前還支持React Native 和 Xamarin。

2014年7月發(fā)布。由YCombinator孵化的創(chuàng)業(yè)團(tuán)隊(duì)歷時(shí)幾年打造,是第一個(gè)專門針對(duì)移動(dòng)平臺(tái)設(shè)計(jì)的數(shù)據(jù)庫。目標(biāo)是取代SQLite。

為了徹底解決性能問題,核心數(shù)據(jù)引擎C++打造,并不是建立在SQLite之上的ORM。
2.為何使用Realm
a. 快速
引用官網(wǎng)上性能比較數(shù)據(jù)柱狀圖,每秒能在200k條記錄的數(shù)據(jù)庫查詢到的數(shù)據(jù)記錄達(dá)到30條,Realm的性能遠(yuǎn)超SQL、FMDB、CoreData的性能。如下:

b. 易用、簡(jiǎn)潔
1)Realm提供多種版本支持OC、swift等多種語言。

2)創(chuàng)建儲(chǔ)存對(duì)象簡(jiǎn)單,僅需集成Realm類;或者通過Realm提供的軟件導(dǎo)入到Xcode,可以直接創(chuàng)建儲(chǔ)存對(duì)象,無需增加額外代碼。

3)相比SQL,不需要記住繁雜SQL語句。

4)相比CoreData,不需要架構(gòu)類與類之間的復(fù)雜關(guān)系;代碼更加簡(jiǎn)潔。學(xué)習(xí)成本更低。
3.如何使用Realm(OC版本) a. 準(zhǔn)備工作
(1) 下載最新的Realm發(fā)行版本,并解壓;

(2) 前往Xcode 工程的”General”設(shè)置項(xiàng)中,從ios/dynamic/、osx/、tvos/或者watchos/中將’Realm.framework’拖曳到”Embedded Binaries”選項(xiàng)中。確認(rèn)Copy items if needed被選中后,點(diǎn)擊Finish按鈕;

(3) 在單元測(cè)試目標(biāo)的”Build Settings”中,在”Framework Search Paths”中添加Realm.framework的上級(jí)目錄;

(4) 下載一個(gè)名為 Realm Browser 的獨(dú)立的Mac應(yīng)用以便 對(duì).realm數(shù)據(jù)庫進(jìn)行讀取和編輯。

(5) 安裝 Realm 插件
打開[release.zip](https://static.realm.io/downloads/objc/realm-objc-1.0.1.zip) 中的plugin/RealmPlugin.xcodeproj并進(jìn)行編譯,重啟 Xcode之后插件即可生效。如果您使用 Xcode 菜單來建立一個(gè)新文件(File > New > File… — or ?N) ,您就可以看到有一個(gè)新建Realm模型的選項(xiàng)。
b. 創(chuàng)建數(shù)據(jù)模型

如圖創(chuàng)建數(shù)據(jù)模型非常方便,跟創(chuàng)建普通的模型沒有區(qū)別。

創(chuàng)建后的.h和.m


我們需要在.h報(bào)錯(cuò)的地方添加屬性以及自定義方法。添加的屬性必須是Realm支持的基本數(shù)據(jù)類型或繼承于RLMObject類型。在.m中defaltPropertyValues方法中設(shè)置默認(rèn)值,在ignoredProperties方法中設(shè)置不保存到數(shù)據(jù)庫的屬性。

項(xiàng)目中使用場(chǎng)景是創(chuàng)建一個(gè)用戶User數(shù)據(jù)模型,這個(gè)模型里面保存有用戶信息、每日的運(yùn)動(dòng)記錄信息、還有用戶保存的拍攝視頻信息,User代碼如下:

User.h文件

#import 
#import "UserInforItem.h"
#import "SportDayItem.h"
#import "SportInforItem.h"
#import "DataModel.h"
#import "VideoItem.h"

@interface User : RLMObject
@property NSString * identification;
@property UserInforItem *userInforItem;
@property RLMArray *sportDayItems;
@property RLMArray *videoItems;

+ (User *)getLastUser;

- (void)addSportInforItem:(SportInforItem *)sportInforItem;


@end

// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(User)

User.m文件

#import "User.h"
#import 

@implementation User

// Specify default values for properties

+ (NSDictionary *)defaultPropertyValues
{
    return @{
             @"userInforItem":@{
                                 @"name": @"",
                                 @"location": @"",
                                 @"genderType": @0,
                                 @"height": @"170",
                                 @"weight": @"60",
                                 @"birth": @"1995-01-01",
                                 @"signature": @"智能運(yùn)動(dòng),引領(lǐng)時(shí)尚",
                                 @"headIconPath": @"",
                                 @"phoneNum": @"",
                                 @"userID": @"",
                                 @"creatTime": [NSDate date],
                                 @"lasLoginTime": @"",
                                 @"lastLoginVersion": @"",
                                 @"isWiFi":@NO
                                },
              @"sportDayItems":@[],
              @"videoItems":@[]
             };
}

+ (NSString *)primaryKey {
    return @"identification";
}

#pragma mark - Public Method

+ (User *)getLastUser
{
    NSString *identification = [DataModel lastLoginID];
    User *user = [User objectForPrimaryKey:identification];
    if (user == nil) {
        user = [[User alloc] init];
        user.identification = [DataModel lastLoginID];
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [realm addObject:user];
        [realm commitWriteTransaction];
    }
    
    return user;
}

- (void)addSportInforItem:(SportInforItem *)sportInforItem
{
    BOOL isHaveTodaySportRecord = NO;
    for (SportDayItem *dayItem in self.sportDayItems) {
        if ([dayItem.sportDate dayOfYear] == [sportInforItem.creatTime dayOfYear]) {
            isHaveTodaySportRecord = YES;
            RLMRealm *realm = [RLMRealm defaultRealm];
            [realm beginWriteTransaction];
            [dayItem.sportInforArray addObject:sportInforItem];
            [realm commitWriteTransaction];
            break;
        }
    }
    
    if (!isHaveTodaySportRecord) {
        SportDayItem *dayItem = [[SportDayItem alloc] init];
        dayItem.sportDate = sportInforItem.creatTime;
        [dayItem.sportInforArray addObject:sportInforItem];
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [self.sportDayItems addObject:dayItem];
        [realm commitWriteTransaction];
    }
}

// Specify properties to ignore (Realm won"t persist these)

//+ (NSArray *)ignoredProperties
//{
//    return @[];
//}

@end
屬性
Realm支持以下的屬性類型:BOOL、bool、int、NSInteger、long、long long、float、double、NSString、NSDate、NSData 以及 被特殊類型標(biāo)記的 NSNumber 。

CGFloat 屬性的支持被取消了,因?yàn)樗念愋筒灰蕾囉谄脚_(tái)。

您可以使用RLMArray 和 RLMObject的子類來建立諸如一對(duì)多、一對(duì)一之類的關(guān)系模型。

PS:從支持類型中能發(fā)現(xiàn)并不支持NSUInteger,NSUInteger類型常用于枚舉類型,對(duì)于Realm不支持的類型,編譯并不會(huì)報(bào)錯(cuò),但運(yùn)行會(huì)直接崩潰。用戶信息屬性UserInforItem是繼承于RLMObject。

主鍵

User.h的identification屬性作為主鍵,需要在.m的+ (NSString *)primaryKey 返回identification屬性名。

+ (NSString *)primaryKey {
        return @"identification";
    }
默認(rèn)屬性

實(shí)現(xiàn)defaultPropertyValues方法,需要返回屬性名的鍵值對(duì)字典。創(chuàng)建User數(shù)據(jù)模型時(shí),會(huì)自動(dòng)設(shè)置這些屬性的默認(rèn)值。若不需要設(shè)置默認(rèn)值,則可以注釋該方法。

+ (NSDictionary *)defaultPropertyValues
{
    return @{
             @"userInforItem":@{
                                 @"name": @"",
                                 @"location": @"",
                                 @"genderType": @0,
                                 @"height": @"170",
                                 @"weight": @"60",
                                 @"birth": @"1995-01-01",
                                 @"signature": @"智能運(yùn)動(dòng),引領(lǐng)時(shí)尚",
                                 @"headIconPath": @"",
                                 @"phoneNum": @"",
                                 @"userID": @"",
                                 @"creatTime": [NSDate date],
                                 @"lasLoginTime": @"",
                                 @"lastLoginVersion": @"",
                                 @"isWiFi":@NO
                                },
              @"sportDayItems":@[],
              @"videoItems":@[]
             };
}
忽略屬性(不保存到數(shù)據(jù)庫)

某些場(chǎng)景中,數(shù)據(jù)模型的一些屬性僅作為中間變量,不需要保存到數(shù)據(jù)庫中。這時(shí)候我們可以實(shí)現(xiàn)ignoredProperties方法,返回一個(gè)數(shù)組包含對(duì)應(yīng)的屬性名即可。

// Specify properties to ignore (Realm won"t persist these)

//+ (NSArray *)ignoredProperties
//{
//    return @[];
//}
查詢數(shù)據(jù)

(1)通過主鍵查找

+ (User *)getLastUser
{
    NSString *identification = [DataModel lastLoginID];
    User *user = [User objectForPrimaryKey:identification];
    if (user == nil) {
        user = [[User alloc] init];
        user.identification = [DataModel lastLoginID];
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [realm addObject:user];
        [realm commitWriteTransaction];
    }
    
    return user;
}

通過objectForPrimaryKey方法從數(shù)據(jù)庫中獲取到User,如果取出來的是nil,就通過如下方法拿到數(shù)據(jù)庫單例,執(zhí)行beginWriteTransaction方法和
commitWriteTransaction方法添加新的user對(duì)象到數(shù)據(jù)庫。需要注意的是beginWriteTransaction方法和commitWriteTransaction方法要配對(duì)使用,否則不能存到數(shù)據(jù)庫。

 RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [realm addObject:user];
        [realm commitWriteTransaction];

(2)通過NSPredicate查詢

通過斷言查找到2016年的運(yùn)動(dòng)記錄,RLMResults可看作是數(shù)組

NSPredicate *pred = [NSPredicate predicateWithFormat:@"dayOfYear = %@,@"2016"];
RLMResults *thisYearSportItems = [sportDayItems objectsWithPredicate:pred];
修改數(shù)據(jù)

通過addObject方法將本次運(yùn)動(dòng)數(shù)據(jù)添加到今天運(yùn)動(dòng)記錄。同理,通過deleteObject刪除數(shù)據(jù)。

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[dayItem.sportInforArray addObject:sportInforItem];
[realm commitWriteTransaction];
數(shù)據(jù)庫遷移

當(dāng)數(shù)據(jù)模型增加新屬性或者修改屬性都需要進(jìn)行數(shù)據(jù)庫遷移。在Appdelegate的didFinishLaunchingWithOptions方法中實(shí)現(xiàn)如下代碼:

#pragma mark - 數(shù)據(jù)庫遷移
- (void)migrationRealm
{
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.schemaVersion = 2;
    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
        // 目前我們還未進(jìn)行數(shù)據(jù)遷移,因此 oldSchemaVersion == 0
        if (oldSchemaVersion < 1) {
            //低于版本1,執(zhí)行相應(yīng)遷移代碼(按版本遷移代碼:按需可選,若增加新屬性或刪除,可不寫)
        }
        if (oldSchemaVersion < 2) {
            //低于版本2,執(zhí)行相應(yīng)遷移代碼(按版本遷移代碼:按需可選,若增加新屬性或刪除,可不寫)
        }
    };
    [RLMRealmConfiguration setDefaultConfiguration:config];
    [RLMRealm defaultRealm];

}

Realm進(jìn)行數(shù)據(jù)遷移是非常方便的。需要把數(shù)據(jù)庫版本+1.如果只是增加或刪除屬性,按版本的遷移代碼不需要寫。Realm會(huì)自動(dòng)進(jìn)行數(shù)據(jù)結(jié)構(gòu)調(diào)整。按版本遷移代碼是高級(jí)特性,使用場(chǎng)景是把數(shù)據(jù)模型的幾個(gè)舊屬性合并成一個(gè)新屬性。

PS:沒有進(jìn)行遷移的數(shù)據(jù)庫版本schemaVersion為0,第一次遷移的數(shù)據(jù)庫版本設(shè)置為1.

結(jié)語

Realm數(shù)據(jù)庫是一個(gè)面向?qū)ο蟆⒑?jiǎn)單易用,性能強(qiáng)大的數(shù)據(jù)庫,還有很多高級(jí)特性需要慢慢學(xué)習(xí)。個(gè)人覺得學(xué)習(xí)成本較低,用起來比較順手的,加入項(xiàng)目中僅增加1M。但剛開始的時(shí)候很容易踩坑,因?yàn)镽ealm報(bào)錯(cuò)信息經(jīng)常讓人摸不著邊。如在使用Realm的過程中遇到任何難解問題,或者你有更好的Realm使用技巧,均可留言互相交流探討。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/17730.html

相關(guān)文章

  • 淺談DOMContentLoaded事件及其封裝方法

    摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測(cè)是否加載完畢,當(dāng)時(shí),表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個(gè)簡(jiǎn)單的代碼實(shí)現(xiàn)。 我們?cè)陂_發(fā)時(shí),經(jīng)常需要檢測(cè)頁面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來淺談一下檢測(cè)頁面是否加載完畢的那些事件們。 1. onload 事件 在頁面的所有資源加載完成時(shí),window對(duì)...

    waruqi 評(píng)論0 收藏0
  • 淺談DOMContentLoaded事件及其封裝方法

    摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測(cè)是否加載完畢,當(dāng)時(shí),表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個(gè)簡(jiǎn)單的代碼實(shí)現(xiàn)。 我們?cè)陂_發(fā)時(shí),經(jīng)常需要檢測(cè)頁面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來淺談一下檢測(cè)頁面是否加載完畢的那些事件們。 1. onload 事件 在頁面的所有資源加載完成時(shí),window對(duì)...

    leon 評(píng)論0 收藏0
  • 淺談webpack特點(diǎn)及其使用(個(gè)人備忘錄)

    摘要:的特點(diǎn)模塊化會(huì)把一切視為模塊,而模塊化的文件會(huì)十分靈活,且容易調(diào)試以及升級(jí),會(huì)讓人有種工程化的意識(shí)。的安裝形式安裝也可以直接安裝到項(xiàng)目的依賴?yán)锱渲萌肟谖募K打包的起點(diǎn)稱之為入口文件。是你第一個(gè)啟動(dòng)的文件。 好多人在剛開始學(xué)習(xí)了webpack之后,可能對(duì)于webpack是什么?怎么用多少會(huì)有些迷茫,下面是我的學(xué)習(xí)心得,希望能幫助到大家,有不足之處,也歡迎提出共同來討論。 webpack...

    Achilles 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

liuhh

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<