中文版-通俗版-項(xiàng)目實(shí)踐版 realm數(shù)據(jù)使用實(shí)踐
本文總結(jié)realm數(shù)據(jù)庫在iOS開發(fā)中遇到的問題以及解決辦法,如果您也有遇到更多realm相關(guān)的問題請聯(lián)系我andybbear@163.com
1风题、realm的使用介紹中文版:https://realm.io/cn/docs/objc/latest/
2客叉、realm的優(yōu)點(diǎn)介紹
【轉(zhuǎn)】
<code>
跨平臺:現(xiàn)在很多應(yīng)用都是要兼顧iOS和Android兩個(gè)平臺同時(shí)開發(fā)。如果兩個(gè)平臺都能使用相同的數(shù)據(jù)庫辽剧,那就不用考慮內(nèi)部數(shù)據(jù)的架構(gòu)不同蹂安,使用Realm提供的API,可以使數(shù)據(jù)持久化層在兩個(gè)平臺上無差異化的轉(zhuǎn)換晴裹。
簡單易用:Core Data 和 SQLite 冗余、繁雜的知識和代碼足以嚇退絕大多數(shù)剛?cè)腴T的開發(fā)者救赐,而換用 Realm涧团,則可以極大地減少學(xué)習(xí)成本,立即學(xué)會本地化存儲的方法经磅。毫不吹噓的說泌绣,把官方最新文檔完整看一遍,就完全可以上手開發(fā)了预厌。
可視化:Realm 還提供了一個(gè)輕量級的數(shù)據(jù)庫查看工具阿迈,在Mac Appstore 可以下載“Realm Browser”這個(gè)工具,開發(fā)者可以查看數(shù)據(jù)庫當(dāng)中的內(nèi)容轧叽,執(zhí)行簡單的插入和刪除數(shù)據(jù)的操作苗沧。畢竟,很多時(shí)候炭晒,開發(fā)者使用數(shù)據(jù)庫的理由是因?yàn)橐峁┮恍┧^的“知識庫”待逞。</code>
【自我簡單總結(jié)】
<code>realm使用簡單,和sqlite相比不用使用sql語句网严,一個(gè)model就是一個(gè)張表识樱,節(jié)省了很大的時(shí)間;但是model需要繼承RLMObject對象。和CoreData相比的化簡化了學(xué)習(xí)成本牺荠,畢竟我從來不用CoreData翁巍。從項(xiàng)目使用的角度來說,realm比較好上手休雌,掌握基本的幾個(gè)方法就能使用灶壶,支持事務(wù),數(shù)據(jù)變化監(jiān)聽杈曲,數(shù)據(jù)遷移驰凛,跨平臺,對于對數(shù)據(jù)庫要求不高担扑,簡單來數(shù)據(jù)庫做緩存的同學(xué)來說恰响,使用簡單。另一方面涌献,realm使用也有一些坑胚宦,例如版本覆蓋安裝,需要進(jìn)行版本遷移燕垃。pod realm 安裝下載比較慢枢劝,這一點(diǎn)可以做成靜態(tài)庫放在自己的git上解決。
</code>
3卜壕、下面廢話少說進(jìn)入正題您旁,show your code 。
使用pod安裝
Podfile寫法轴捎,指定使用最新版2.8.3
<code>
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '7.0'
target :RealmDemo do
pod 'Realm', '2.8.3'
end
</code>
一鹤盒、創(chuàng)建數(shù)據(jù)庫
//1、使用默認(rèn)的realm侦副,會在Documents/下生成一個(gè)default.realm文件
<pre><code>
RLMRealm *defaultRealm = [RLMRealm defaultRealm];</pre></code>
//2侦锯、自定義路徑
<pre>
NSString *rlmPath =[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingString:@"/custom.realm"];
RLMRealm *customRealm = [RLMRealm realmWithURL:[NSURL URLWithString:rlmPath]];
</pre>
//3、通過配置生成realm
<pre>
RLMRealm *configRealm = [RLMRealm realmWithConfiguration:self.config error:nil];
</pre>
4跃洛、獲取config的方法
<pre>
- (RLMRealmConfiguration *)config {
static RLMRealmConfiguration *_config = nil;
if (!_config) {
RLMRealmConfiguration *config = [[RLMRealmConfiguration alloc] init];
//配置數(shù)據(jù)遷移的時(shí)候率触,如果有錯(cuò)誤導(dǎo)致崩潰問題终议,會刪除數(shù)據(jù)庫重建汇竭,不會崩潰,但是數(shù)據(jù)會丟失穴张。配置NO數(shù)據(jù)不會丟失细燎,但是應(yīng)用會崩潰
config.deleteRealmIfMigrationNeeded = YES;
NSString *configPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingString:@"/config.realm"];
config.fileURL = [NSURL URLWithString:configPath];
//設(shè)置realm管理的RLMObjects,管理了那么些表,多個(gè)數(shù)據(jù)庫表可以分開管理
config.objectClasses = @[NSClassFromString(@"Person"),NSClassFromString(@"Dog")];
_config = config;
}
return _config;
}
</pre>
二皂甘、數(shù)據(jù)遷移
<pre>
//在APP didFinishLaunching調(diào)用
+(void)dataBaseMigration {
//如果使用的defualt realm獲取默認(rèn)的config進(jìn)行遷移
RLMRealmConfiguration *defaultConfig = [RLMRealmConfiguration defaultConfiguration];
//配置數(shù)據(jù)版本玻驻,每次項(xiàng)目發(fā)布加1
defaultConfig.schemaVersion = 2;
defaultConfig.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
if (oldSchemaVersion < 2) {
//歷史版本進(jìn)行遷移
// [migration enumerateObjects:@"xxx" block:^(RLMObject * _Nullable oldObject, RLMObject * _Nullable newObject) {
//
// }];
}
};
//使用自定義配置的config realm進(jìn)行遷移
RLMRealmConfiguration *config = self.config;
//配置數(shù)據(jù)版本,每次項(xiàng)目發(fā)布加1
config.schemaVersion = 2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
if (oldSchemaVersion < 2) {
//歷史版本進(jìn)行遷移
// [migration enumerateObjects:@"xxx" block:^(RLMObject * _Nullable oldObject, RLMObject * _Nullable newObject) {
//
// }];
}
};
}
</pre>
三、在Documents下可以找到數(shù)據(jù)庫璧瞬,
可以用可視化工具打開(在Mac Appstore 可以下載“Realm Browser”這個(gè)工具)
下一篇將介紹表的創(chuàng)建和數(shù)據(jù)的增刪改查
代碼在這里:https://github.com/icoder20150719/Realm-