Relam数据库(OC版本)

  1. cocopods 导入

     platform :ios, '11.0'
     target 'TestRealm' do
     use_frameworks!
      pod 'Realm', '~> 10.15.0'
     end
    
     target 'TestRealmTests' do
     use_frameworks!
     pod 'Realm', '~> 10.15.0'
     end
    

2.使用

2.1 头文件 #import <Realm/Realm.h>

2.2

      #import <Foundation/Foundation.h>
      #import <Realm/Realm.h>
      NS_ASSUME_NONNULL_BEGIN
    //注意这里属性的写法 不写策略
    @interface Student : RLMObject
    @property long num;
    @property int age;
    @property NSString *name;
    @end
    RLM_ARRAY_TYPE(Student)

    NS_ASSUME_NONNULL_END

.m

    #import "Student.h"

    @implementation Student
      //  主键
    +(NSString*)primaryKey{
        return @"num";
    }
  //+(NSDictionary*)defaultPropertyValues{
  //    return @{};
  //}
  //+(NSArray*)ignoredProperties{
  //    return @[];
//}
  @end

3 操作

3.1 保存

          创建一个对象
          Student * stu2 = [[Student alloc]initWithValue:@{@"age":@(20),@"name":@"帅哥",@"num":@(4)}];
      生成一rlm
         RLMRealm * rlm = [RLMRealm defaultRealm];

      保存和跟新
       [rlm transactionWithBlock:^{
       // [rlm addObject:stu]; //保存
        [rlm addObject:stu2];//更新
       [rlm addOrUpdateObject:stu2];//保存或者更新
}];
  // 由于realm 有映射关系,下面的代码也能更新数据库表
    [rlm transactionWithBlock:^{
        stu.age = 30;
    }];

3.2 查询

RLMResults<RLMObjectType> : NSObject<RLMCollection, NSFastEnumeration> 可以看成是一个装有RLMObject 模型的数组

    //  根据主键查找
 Student* stu =    [Student objectForPrimaryKey:@(1)];
 [Student objectsInRealm:rlm withPredicate:@"age = 30"];


    // 更具条件查找
   RLMResults *results=  [Student objectsWhere:@"age = 30"]
          [Student objectsInRealm:rlm where:@"age = 30"];

    RLMResults *results= [Student allObjects];
    stu = results.fristObject;
       // 由于realm 有映射关系,下面的代码也能更新数据库表

    [rlm transactionWithBlock:^{
    stu.age = 10;
    }];

删除数据

注意: 删除的模型必须是数据库管理的,不能是自己创建的,应该是从数据库中读取的。

  [rlm transactionWithBlock:^{  
    [rlm deleteObject:stu2];删除一个
    [rlm deleteObjects:@[]];删除多个
    [rlm deleteAllObjects];// 删除所有
}];

分页

第一个3 ,跳过3条
第二个3 ,是取3条
select * from db limit 3,3

兼容的数据类型

1.imge
用连个属性来表示,一个用来外界来读,一个imageData外界用来取

    h 文件
  @property NSData*imageData;
  @property (readonly)UIImage *image;
   m 文件
  -(UIImage*)image{
return [UIImage imageWithData:self.imageData];
}

2 集合 NSArray 字典,集合都不支持,(用imge的方法,或者存字符串)

对应关系

####### 一对一

    #import <Foundation/Foundation.h>
    #import <Realm/Realm.h>
    #import "Dog.h"
    NS_ASSUME_NONNULL_BEGIN

    @interface Student : RLMObject
    @property long num;
    @property int age;
    @property NSString *name;
  @property NSData*imageData;
  @property (readonly)UIImage *image;
  @property  RLMArray<Dog*><Dog> *pet;
  @end
  RLM_ARRAY_TYPE(Student)

  NS_ASSUME_NONNULL_END


    #import "Student.h"
    @implementation Student

    -(UIImage*)image{
      return [UIImage imageWithData:self.imageData];
  }
    +(NSString*)primaryKey{
      return @"num";
  }
  //+(NSDictionary*)defaultPropertyValues{
//    return @{};
//}
//+(NSArray*)ignoredProperties{
//    return @[];
//}
@end


    #import <Foundation/Foundation.h>
    #import <realm/Realm.h>
  @class Student;
  NS_ASSUME_NONNULL_BEGIN

  @interface Dog : RLMObject
  @property int num;
  @property NSString *name;
  @property (readonly) RLMLinkingObjects *master;//定义的这个类型 readlony 是会忽略的
@end

RLM_ARRAY_TYPE(Dog)
NS_ASSUME_NONNULL_END

  #import "Dog.h"

@implementation Dog

    +(NSDictionary<NSString *,RLMPropertyDescriptor *>       *)linkingObjectsProperties{

return  @{@"master":[RLMPropertyDescriptor descriptorWithClass:NSClassFromString(@"Student") propertyName:@"pets"]};//实现了这个,如果student 中的pets 中有这个dog的话,dog 中就会有一个student 反向的对应
}
@end

不能为空的属性

在.m 重实现这个协议,实现了这个协议,如果name 为nil 没有值,在写入数据库的时候会报错,修改的时候也不能改成空。

+(NSArray<NSString *> *)requiredProperties{
    return @[@"name"];// name 必须有值
}

设置默认值

+(NSDictionary*)defaultPropertyValues{
return @{@"name":@"baby"};// 
}
通知
    @interface TestRealmTests : XCTestCase
  // 保存属性
  @property(nonatomic,strong)RLMNotificationToken *token; 
  @end

  @implementation TestRealmTests

  - (void)setUp {
[super setUp];
RLMRealm *real = [RLMRealm defaultRealm];
 self.token =  [real addNotificationBlock:^(RLMNotification  _Nonnull notification, RLMRealm * _Nonnull realm) {
   NSLog(@"接受到了通知 %@ %@",real,notification);
}];

// 这个通知更加牛 RLMCollectionChange 这里面有删除的,插入的,和改变的
self.token2 = [[Student allObjects]addNotificationBlock:^(RLMResults * _Nullable results, RLMCollectionChange * _Nullable change, NSError * _Nullable error) {

}];
// Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
[self.token invalidate];
[super tearDown];
// Put teardown code here. This method is called after the invocation of each test method in the class.
}

- (void)testExample {

Student * stu = [[Student alloc]initWithValue:@{@"age":@(18),@"name":@"帅哥",@"num":@(1)}];
RLMRealm *real = [RLMRealm defaultRealm];

[real transactionWithBlock:^{
    [real addOrUpdateObject:stu];//这里会发出通知
}];
[real transactionWithBlock:^{
    stu.age = 30; // 这里也会发出通知
}];

用户机制

// 新增一个方法来改边存储表的名字

-(void)setDefaultRealmForuUser:(NSString*)userId{

RLMRealmConfiguration * config = [RLMRealmConfiguration defaultConfiguration];
config.fileURL = [[[config.fileURL URLByDeletingLastPathComponent] URLByAppendingPathComponent:userId]URLByAppendingPathExtension:@"realm"];
[RLMRealmConfiguration setDefaultConfiguration:config];

}

使用

 [self setDefaultRealmForuUser:@"王武"];
  //这里调用的时候就更新林要操作的表的名字
  RLMRealm *real = [RLMRealm defaultRealm];

后面通过调用realm 来操作

删除指定用户的数据库

就是删除指定目录下的文件

-(void)testDelete{
[self setDefaultRealmForuUser:@"lisi"];
NSFileManager *fileManger = [NSFileManager defaultManager];
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
NSArray*realmfileUrls = @[config.fileURL,
                          [config.fileURL URLByAppendingPathExtension:@"lock"],
                          [config.fileURL URLByAppendingPathExtension:@"management"],
                          [config.fileURL 
        ];
for (NSURL *url in realmfileUrls) {
    [fileManger removeItemAtPath:url error:nil];
}
}

数据库的迁移

    RLMRealmConfiguration * config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion = 1;

[config setMigrationBlock:^(RLMMigration * _Nonnull migration, uint64_t oldSchemaVersion) {
    if (config.schemaVersion > oldSchemaVersion) {

        这里不需要做什么就会自动实现数据迁移
  //更名操作,将Student 中的name1 改成name2
 [migration renamePropertyForClass:@"Student" oldName:@"name1" newName:@"name2"];

  // 下面的操作是将 Student模型中的fullNmae 用老的name1 和老的name2 的数据拼接起来,到达数据库迁移的时候合成fullNmae 的值
[migration enumerateObjects:@"Student" block:^(RLMObject * _Nullable oldObject, RLMObject * _Nullable newObject) {
            newObject[@"fullNmae"] = [NSString stringWithFormat:@"%@%@",oldObject[@"name1"],oldObject[@"name2"]];
        }]
    }
}];
[RLMRealmConfiguration setDefaultConfiguration:config];
[RLMRealm defaultRealm];
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容