2017-05-04 47 views
4

首先,我在ios上比較新,並且沒有使用移動數據庫的經驗。我是否應該使用Realm倉庫(ios)

想要集成到我的應用Realm(swift),並想知道服務層和存儲庫是分開還是一切都包含在服務中是有意義的。

舉一個例子來看看。

class UserService { 

    var userRepository: UserRepository! 

    func findById(userId: String) -> User? { 
     return userRepository.findById(userId: userId) 
    } 
} 

class UserRepository { 

    private let realm = try! Realm() 

    func findById(userId: String) -> User? { 
     return realm.object(ofType: User.self, forPrimaryKey: userId) 
    } 
} 

回答

3

添加了數據庫API頂部的抽象層是很常見的。許多其他開發人員在自己的類中包裝了Realm,以便將API從其業務邏輯代碼中隱藏起來。

有幾個注意事項,其中要注意:

  1. 你需要carful從這個不小心傷性能。有些用戶甚至將數據從Realm對象複製到他們自己的對象中。這破壞了Realm的「零複製」機制的目的,因此該應用程序現在本身的性能比使用Realm本身更差。
  2. 這是'搶先工作'。你在前面做了很多工作,,以防萬一你可能會改變你的想法。前段時間,我在一個相當大的應用程序中將Core Data轉換爲Realm,並且只花了幾個小時。試圖構建一個「通用」數據庫解決方案,您可能永遠不會使用聽起來像它可能沒有回報。
  3. 你正在增加應用程序的複雜性。這意味着更多潛在的錯誤和更嚴格的測試將需要確保您的API和數據庫API同步。

只要您要移動到的新數據庫也包含管理對象(即核心數據),則從一個數據庫轉換到另一個通常不是很多工作。因此,我建議避免不必要的工作,直到必要的時候。

聲明:我爲Realm工作,但這是我的意見,因爲過去曾使用Core Data,原始SQLite和Realm發佈個人應用程序。

+0

我想更多關於哪種方式(模式)更方便您好Tim,我知道您已經爲Realm團隊工作過對於第一點,你對這種情況推薦什麼: 你有一個在其他地方被刪除的Realm對象,但是你試圖訪問它並且會崩潰,因爲一旦它將不再在Realm中。我只是想着做點類似於你在第一點中描述的事情,但現在我讀到它可能不值得。我想使用一個通用的存儲庫,我猜想我使用了領域和類型依賴注入。 – Cyupa

+1

Hi @Cyupa!如果你有兩個Realm'Object'實例指向磁盤上的同一個對象,如果你刪除了這個對象的一個​​實例,另一個實例將自動失效,你將不能再從它讀取數據。這實際上取決於'爲什麼'要保留刪除後的數據,但對於進行內存複製仍然是一個可接受的折衷方案。 – TiM

+0

Hi @TiM,一個小細節:我們應該在應用程序中保留一個「Realm」還是爲每個存儲庫或擴展方法創建此類? 私人讓realm =試試吧! Realm() –

1

您可以使用擴展來添加抓取方法。 爲數據庫中的每個實體添加對象子類,然後在需要時爲這些方法添加擴展。 例子:

import RealmSwift 

// Dog model 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var owner: Person? // Properties can be optional 
} 

的爲你取方法:

extension Dog { 
    class func fetch(with name: String) -> Dog? { 
     return try! Realm().objects(Dog.self).filter("name == %@", name).first 
    } 
} 
+0

感謝您的回答,如果我錯了,請糾正我,假設您的意思是我不需要存儲庫層,如果是這樣,當我決定更改爲CoreData時,則必須刪除/更改所有擴展名我所有的模型還是? – mihatel

+0

您也可以在CoreData中使用擴展。你可以按照這個教程向後:https://news.realm.io/news/migrating-from-core-data-to-realm – pesch

+0

這是從CoreData否,但無論如何我有你的想法... 如果將來需要更改DB – mihatel

相關問題