Vương quốc có sử dụng mongodb không?

Ngày nay, sự phát triển ứng dụng di động đang trở thành xu hướng và phổ biến khắp mọi nơi. Hiện nay có khá nhiều hệ điều hành di động phổ biến và đi kèm đó là ngôn ngữ riêng cho từng hệ điều hành riêng biệt (Java cho Android; Swift hoặc Objective-C dành cho iOS,. )

Trong mỗi ứng dụng, phần quan trọng không kém chính là Cơ sở dữ liệu. Cơ sở dữ liệu biến phổ biến nhất được sử dụng hiện nay trên hầu hết các thiết bị là SQLite bởi vì nó khá quen thuộc với đại đa số các thành viên lập trình sử dụng câu truy vấn SQL. Tuy nhiên, SQLite cũng có những mặt hạn chế nhất định như tốc độ truy vấn khá chậm khi mà dữ liệu nuôi cũng ra như khi thực hiện cho phép THAM GIA. Hơn nữa, với mỗi ngôn ngữ khác nhau thì việc thiết lập SQLite có thể thu được khá nhiều công sức

Trên cơ sở đó, Realm Mobile Database ra đời với mục đích cung cấp cho lập trình viên một lựa chọn có thể thay thế cho SQLite hiện tại nhưng vẫn đảm bảo mọi chức năng cần thiết của một cơ sở dữ liệu thông thường

  • Realm Moblie Database (gọi tắt là RMD) là một NoSQL (Không chỉ SQL). Nó hướng tới việc xây dựng một ứng dụng theo hướng ** Cơ sở dữ liệu ngoại tuyến trước. ** Điều này có nghĩa là ứng dụng vẫn có thể hoạt động mặc dù không có kết nối mạng, dữ liệu sẽ được lưu trực tiếp trên thiết bị, người dùng vẫn có thể tiến hành mọi công việc một cách thuận lợi
  • RMD lưu trữ dữ liệu dưới dạng Object và nó cũng cung cấp các hàm và phương thức để có thể truy vấn dữ liệu mà không cần thông qua câu truy vấn SQL
  • Phần lõi của RMD được viết bằng C++ và là mã nguồn mở, người dùng có thể tùy chỉnh lại theo ý muốn cá nhân
  • Cross-flatform and  đã có phiên bản cho các ngôn ngữ sau. Swift, Java, Mục tiêu – C, Xamarin, React Bản địa
  • Cung cấp miễn phí

(Trong nội dung bài viết dưới đây, tác giả sẽ nói về việc sử dụng Realm dành cho Swift)

II. Điểm mạnh của Realm Mobile Database

1. Cài đặt và sử dụng

  • RMD khá dễ cài đặt và sử dụng. Đối với iOS, chúng ta có thể sử dụng thư viện quản lý CocoaPods để cài đặt và sử dụng
  • Để sử dụng RMD, chúng ta chỉ cần tạo một lớp như bình thường, và kế thừa từ lớp “Đối tượng” của RMD
import Foundation
import RealmSwift

class Message: Object {
    dynamic var id: String = ""
    dynamic var message: String?
    dynamic var name: String?
}

2. Tốc độ truy vấn nhanh

RMD được tối ưu hóa để sử dụng bộ nhớ một cách ít nhất nhưng hiệu quả vẫn vượt trội so với các cơ sở dữ liệu khác

Dưới đây là bảng so sánh tốc độ của Realm so với các CSDL khác

3. Trình duyệt cảnh giới

Đối với hệ điều hành MacOS, Realm cung cấp công cụ Realm Browser giúp chúng ta có thể dễ dàng quản lý dữ liệu. Ngoài ra, chúng ta còn có thể trực tiếp thay đổi dữ liệu trên công cụ này

4. Cross – Nền tảng

Realm hiện đã có phiên bản hỗ trợ trên các ngôn ngữ lập trình di động phổ biến. Chúng ta có thể sử dụng một cơ sở dữ liệu duy nhất cho tất cả các phiên bản trên các hệ điều hành di động khác nhau. Hiện tại Realm này đã được hỗ trợ cho các ngôn ngữ sau. Java, Swift, Mục tiêu – C, Xamarin, React Bản địa

III. Một số chức năng chính của Realm Mobile Database

1. người mẫu

  • Để sử dụng RMD, ta chỉ cần tạo một mô hình lớp như bình thường và kế thừa lớp “Object” của Realm. Đối với ngôn ngữ Swift, ta cần thêm “động” vào phía trước các thuộc tính mà ta cần trong DB
  • Realm hỗ trợ đầy đủ các định dạng thông thường như String, Int8, Int16, Int32, Int64, Double, Float, NSDate, NSData
  • Đối với các loại dữ liệu String, NSDate, NSData thì có thể là thuộc tính tùy chọn. Kiểu dữ liệu Đối tượng thì bắt buộc phải là tùy chọn;
  • Chúng ta có thể đặt Primary Key, Indexed cho một lớp bằng cách ghi đè lại các hàm như
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    2;
import Foundation
import RealmSwift

class Dog: Object {
    dynamic var id:Int = 0
    dynamic var name: String?
    dynamic var createdAt: NSDate?
    let age = RealmOptional()
    // Relationship
    dynamic var owner: Person? //To - One Relationship
    let friends = List() //To-Many relationships

    //Set primary key
    override static func primaryKey() -> String? {
        return "name"
    }
    //Set index properties
    override static func indexedProperties() -> [String] {
        return ["name"]
    }
    
}

2. viết

Tạo nên. Có cách nào để khởi tạo 1 Object, ta có thể sử dụng nhiều cách khác nhau để khởi động

// (1) Create a Dog object and then set its properties
var myDog = Dog()
myDog.name = "Rex"
myDog.age = 10

// (2) Create a Dog object from a dictionary
let myOtherDog = Dog(value: ["name" : "Pluto", "age": 3])

// (3) Create a Dog object from an array
let myThirdDog = Dog(value: ["Fido", 5])

Sau khi đối tượng được khởi động, có thể sử dụng một cách bình thường. Đối tượng này chỉ được lưu xuống bộ nhớ khi chúng ta thực hiện chức năng viết. Sau khi Object đã được viết rồi thì mọi thay đổi trên nó sẽ ngay lập tức được lưu lại xuống DB một cách tự động

// Create Object
var myDog = Dog()
myDog.name = "Hachi"
myDog.age = 10 //age = 10

// Get the default Realm
let realm = try! Realm()
// You only need to do this once (per thread)

// Add to the Realm inside a transaction
try! realm.write {
  realm.add(myDog) //Object is saved in DB
}

// Update age, value is saved automatically
myDog.age = 20

Cập nhật. Có nhiều cách để cập nhật một đối tượng như là. cập nhật theo PrimaryKey (Realm sẽ tự động tìm kiếm theo đối tượng PrimaryKey và cập nhật), cập nhật theo kiểu Key-Value (phù hợp với việc cập nhật dữ liệu trong thời gian chạy)

// Creating a dog with the same primary key as a previously saved dog
let shibuDog = Book()
shibuDog .name= "Nobi"
shibuDog .age= 4
shibuDog .id = 1

// Update using Primary Key
// Updating dog with id = 1
try! realm.write {
  realm.add(shibuDog , update: true)
}

try! realm.write {
  realm.create(Dog.self, value: ["id": 1, "age": 4], update: true)
  // the dog's `name` property will remain unchanged.
}

// Update Object using Key - Value code
let persons = realm.objects(Person.self)
try! realm.write {
  persons.first?.setValue(true, forKeyPath: "isFirst")
  persons.setValue("name", forKeyPath: "Jane")
}

Xóa bỏ. To delete a Object or delete all Object in Realm

// let dog = ....

// Delete an object in transaction
try! realm.write {
  realm.delete(dog)
}

// Delete all objects from the realm
try! realm.write {
  realm.deleteAll()
}

3. Truy vấn

  • Trong Realm, câu Truy vấn sẽ trả về một kết quả  trường hợp có thuộc tính duy nhất là Đối tượng của lớp được truy vấn
  • Ở trong Realm, câu truy vấn thuộc dạng lười biếng, tức là dữ liệu chỉ thực sự được đọc khi nó được truy cập. Hơn nữa, câu truy vấn trong Realm không tạo ra 1 bản sao của dữ liệu mà chính là dữ liệu thực sự đang được lưu dưới đĩa, do đó mọi thay đổi của chúng ta trên các thuộc tính này sẽ ngay lập tức được lưu lại
________số 8_______
  • ** Lọc. **với hàm lọc, chúng ta có thể lọc và chọn ra các đối tượng cụ thể có điều kiện thỏa mãn. Hàm filter sử dụng giống với NSPredicate và có cấu trúc tương tự như SQL
  • Hàm Filter hỗ trợ đầy đủ các phép so sánh như
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    4,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    5,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    6,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    7,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    8,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    9. Đối với dữ liệu kiểu String hoặc NSData thì nó cũng hỗ trợ các phép tìm kiếm như
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    4,
    import Foundation
    import RealmSwift
    
    class Dog: Object {
        dynamic var id:Int = 0
        dynamic var name: String?
        dynamic var createdAt: NSDate?
        let age = RealmOptional()
        // Relationship
        dynamic var owner: Person? //To - One Relationship
        let friends = List() //To-Many relationships
    
        //Set primary key
        override static func primaryKey() -> String? {
            return "name"
        }
        //Set index properties
        override static func indexedProperties() -> [String] {
            return ["name"]
        }
        
    }
    
    5,
    // (1) Create a Dog object and then set its properties
    var myDog = Dog()
    myDog.name = "Rex"
    myDog.age = 10
    
    // (2) Create a Dog object from a dictionary
    let myOtherDog = Dog(value: ["name" : "Pluto", "age": 3])
    
    // (3) Create a Dog object from an array
    let myThirdDog = Dog(value: ["Fido", 5])
    
    2,
    // (1) Create a Dog object and then set its properties
    var myDog = Dog()
    myDog.name = "Rex"
    myDog.age = 10
    
    // (2) Create a Dog object from a dictionary
    let myOtherDog = Dog(value: ["name" : "Pluto", "age": 3])
    
    // (3) Create a Dog object from an array
    let myThirdDog = Dog(value: ["Fido", 5])
    
    3,
    // (1) Create a Dog object and then set its properties
    var myDog = Dog()
    myDog.name = "Rex"
    myDog.age = 10
    
    // (2) Create a Dog object from a dictionary
    let myOtherDog = Dog(value: ["name" : "Pluto", "age": 3])
    
    // (3) Create a Dog object from an array
    let myThirdDog = Dog(value: ["Fido", 5])
    
    4
// Query using a predicate string
var tanDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'")

// Query using an NSPredicate
let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "tan", "B")
tanDogs = realm.objects(Dog.self).filter(predicate)
  • **xâu chuỗi. **Điểm đặc biệt của Realm là nó cho phép tạo chuỗi truy vấn, tức là câu truy vấn sau đó có thể thực hiện dựa trên giá trị của câu truy vấn trước đó
let tanDogs = realm.objects(Dog.self).filter("color = 'tan'")
let tanDogsWithBNames = tanDogs.filter("name BEGINSWITH 'B'")
  • Sắp xếp. Realm cho phép sắp xếp giá trị trả về theo một hoặc nhiều thuộc tính
// Sort tan dogs with names starting with "B" by name
let sortedDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'").sorted(byProperty: "name")
  • Kết quả giới hạn. do cách lấy dữ liệu của Realm is lazy nên giới hạn số lượng đối tượng trả về là không cần thiết

4. thông báo

Điểm mạnh của Realm là có thể đăng ký một người nghe để tiếp nhận thông tin bất cứ khi nào dữ liệu trên Bộ sưu tập, Kết quả, Danh sách bị thay đổi. Khi giao dịch bất kỳ cam kết nào thực hiện thì nó đều gửi đi 1 thông báo, chúng ta chỉ cần đăng ký để lắng nghe thông báo đó thì sẽ biết được khi nào dữ liệu thay đổi và thực hiện việc cập nhật lại giao diện. Có 2 loại thông báo. Thông báo cảnh giới và Thông báo bộ sưu tập

thông báo lĩnh vực. đây là thông báo của ví dụ về lĩnh vực, nó sẽ được gọi là bất kỳ khi nào có 1 giao dịch cam kết được thực thi

import Foundation
import RealmSwift

class Dog: Object {
    dynamic var id:Int = 0
    dynamic var name: String?
    dynamic var createdAt: NSDate?
    let age = RealmOptional()
    // Relationship
    dynamic var owner: Person? //To - One Relationship
    let friends = List() //To-Many relationships

    //Set primary key
    override static func primaryKey() -> String? {
        return "name"
    }
    //Set index properties
    override static func indexedProperties() -> [String] {
        return ["name"]
    }
    
}
0

Bộ sưu tập Thông báo. thông báo này chỉ gọi khi dữ liệu trên 1 đối tượng cụ thể mà ta đăng ký có sự thay đổi. Nó cũng xác định cho ta biết dữ liệu bị thay đổi như thế nào (chèn, cập nhật, xóa)