Hướng dẫn lĩnh vực mongodb

Cơ sở dữ liệu cõi là cơ sở dữ liệu dành cho thiết bị di động, được xây dựng từ nền tảng cho phép chạy trực tiếp trong điện thoại, bảng máy tính và các thiết bị đeo được

Realm có một slogan rất hay. “cơ sở dữ liệu tốt hơn, nhanh hơn, đơn giản hơn“

Dễ dàng nhận ra các từ “tốt hơn, nhanh hơn và đơn giản hơn” với nghĩa là so sánh giữa Relam và SQLite. Trong khi SQLite vẫn là sự lựa chọn mặc định từ xưa đến nay và vẫn tiếp tục phát triển

Cơ sở dữ liệu Realm trong Android đang hoạt động như thế nào?

Realm active bằng cách lưu các Đối tượng Java trực tiếp vào đĩa thay vì ánh xạ chúng sang một kiểu dữ liệu khác như SQLite đang làm

Vương quốc có thể ánh xạ nhiều loại Đối tượng khác nhau vào một tệp trên đĩa. Hay nói cách khác, Các cõi không có yêu cầu ánh xạ riêng biệt từng đối tượng Java đến phiên bản được lưu trữ trên đĩa

Nó giống với triết lý. “cái bạn thấy là cái được lưu”. Nếu các đối tượng được quản lý bởi Realm bị thay đổi bởi người dùng, nó sẽ tự động được lưu vào cơ sở dữ liệu. Vương quốc quản lý các Đối tượng tương tự như SQLite quản lý các bảng

Để một lớp Java trở thành Realm Managed, Lớp đó phải mở rộng từ RealmObject hoặc triển khai Giao diện RealmModel

Realm database in Android with apps display the language

Để hiểu rõ hơn Realm database trong Android, chúng ta hãy tạo một ứng dụng demo đơn giản. Hiển thị các câu danh ngôn được lưu trong cơ sở dữ liệu sử dụng Realm

Ứng dụng có giao diện kiểu như sau

Hướng dẫn lĩnh vực mongodb
Ứng dụng tuyển tập câu lệnh hay

#1. Cài đặt cơ sở dữ liệu Realm trong Android

Chuyển từ SQLite sang Realm database cũng rất đơn giản. Thêm Realm vào dự án Android mới hoặc dự án Android hiện tại chỉ cần thực hiện các bước sau

Đầu tiên, bạn thêm các phụ thuộc sau khi xây dựng. phân lớp

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath "io.realm:realm-gradle-plugin:2.3.1"
  }
}

Sau đó, bạn áp dụng plugin

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
0 vào file build đầu tiên. gradle (trong ứng dụng thẻ)

apply plugin: 'com.android.application'
apply plugin: 'realm-android'

Khi thay đổi bản dựng. gradle, bạn nhớ sync lại grade khi Android Studio yêu cầu nhé

🔥 Học cách sử dụng Android Studio chi tiết. Toàn tập cách sử dụng Android Studio

OK, chúng ta đã hoàn thành bước đầu, bước tiếp theo là khởi động nó

#2. Khởi tạo cơ sở dữ liệu Realm database trong Android

Nơi tốt nhất để thực hiện việc khởi động này là trong một lớp mở rộng từ Ứng dụng

Đối với dự án demo, mình thêm một lớp là ProntoQuoteApplication. java

Để khởi động Realm cơ sở dữ liệu, ta làm như sau

public class ProntoQuoteApplication extends Application {
 
    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)){
            return;
        }
        initRealm();
    }
 
    private void initRealm() {
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("prontoschool.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();
        Realm.setDefaultConfiguration(config);
}

Trong đoạn mã trên, mình đã sử dụng RealmConfiguration Object để truyền các tham số đến Realm

Bước này thực ra chỉ là tùy chọn thôi – nếu chúng ta không cấu hình cơ sở dữ liệu thì những thông số mặc định sẽ được sử dụng

#3. Tạo bảng cơ sở dữ liệu Realm

Trong Realm không có bảng khái niệm như SQLite, thay vào đó chúng ta có Realm Managed object

Cụm từ “tạo bảng” được sử dụng chỉ là do sự tương đồng mà thôi. Để tạo bảng hoặc cập nhật các đối tượng tự động, tất cả các lớp mô hình phải được mở rộng từ lớp RealmObject

Trong Realm cũng có thể xây dựng mối quan hệ một – nhiều (1-n). Ví dụ như app demo trong bài viết này là mối quan hệ giữa. Tác giả và trích dẫn. Một tác giả có thể có nhiều trích dẫn nhưng một trích dẫn thì chỉ có một tác giả

public class Quote extends RealmObject{
      @PrimaryKey
      private long id;
      private String quote;
      private Author author;
      private Category category;
      private String quoteBackgroundImageUrl;
      private boolean isFavourite;
  }

  public class Author extends RealmObject{
      @PrimaryKey
      private long id;
      private String authorName;
      private String authorImageUrl;
      private RealmList quotes;
    }

Bây giờ chúng ta có thể lưu các thể hiện của các lớp này trực tiếp vào cơ sở dữ liệu Realm

#4. Việc tạo Khóa chính tự động tăng

Hiện tại, Realm không hỗ trợ khóa chính tự động tăng (auto increment). Vì sao làm thế nào bây giờ?

Cách workaground đơn giản là chúng ta tăng giá trị khóa chính thủ công. Mình định nghĩa một biến tĩnh (biến tĩnh) kiểu AtomicLong trong ProntoQuoteApplication. java

Khi ứng dụng chạy, mình sẽ kiểm tra các bảng, đối tượng quản lý. Nếu nó đã được tạo, mình sẽ lấy giá trị khóa chính tối đa của đối tượng đó và lưu nó trong biến AtomicLong

Sau đó, mỗi khi muốn lưu một đối tượng vào cơ sở dữ liệu, mình sẽ có khóa chính và tự động tăng giá trị của nó lên rồi sử dụng nó cho lần tiếp theo

Đây là cách thực hiện bằng mã

public class ProntoQuoteApplication extends Application {

    public static AtomicLong quotePrimaryKey;
    public static AtomicLong authorPrimaryKey;

    @Override
    public void onCreate() {
        super.onCreate();
        initRealm();        
    }    

    private void initRealm() {
        Realm.init(this);
        RealmConfiguration configuration  = new RealmConfiguration.Builder()
                .name(Constants.REALM_DATABASE)
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();
        //Now set this config as the default config for your app
        //This way you can call Realm.getDefaultInstance elsewhere

        Realm.setDefaultConfiguration(configuration);

        //Get the instance of this Realm that you just instantiated
        //And use it to get the Primary Key for the Quote and Category Tables
        Realm realm = Realm.getInstance(configuration);

        try {
            //Attempt to get the last id of the last entry in the Quote class and use that as the
            //Starting point of your primary key. If your Quote table is not created yet, then this
            //attempt will fail, and then in the catch clause you want to create a table
            quotePrimaryKey = new AtomicLong(realm.where(Quote.class).max("id").longValue() + 1);
        } catch (Exception e) {
            //All write transaction should happen within a transaction, this code block
            //Should only be called the first time your app runs
            realm.beginTransaction();

            //Create temp Quote so as to create the table
            Quote quote = realm.createObject(Quote.class, 0);

            //Now set the primary key again
            quotePrimaryKey = new AtomicLong(realm.where(Quote.class).max("id").longValue() + 1);

            //remove temp quote
            RealmResults results = realm.where(Quote.class).equalTo("id", 0).findAll();
            results.deleteAllFromRealm();
            realm.commitTransaction();
        }

        try {
            //Attempt to get the last id of the last entry in the Author class and use that as the
            //Starting point of your primary key. If your Author table is not created yet, then this
            //attempt will fail, and then in the catch clause you want to create a table
            authorPrimaryKey = new AtomicLong(realm.where(Author.class).max("id").longValue() + 1);
        } catch (Exception e) {
            //All write transaction should happen within a transaction, this code block
            //Should only be called the first time your app runs
            realm.beginTransaction();

            //Create temp Author so as to create the table
            Author author = realm.createObject(Author.class, 0);

            //Now set the primary key again
            authorPrimaryKey = new AtomicLong(realm.where(Author.class).max("id").longValue() + 1);

            //remove temp author
            RealmResults results = realm.where(Author.class).equalTo("id", 0).findAll();
            results.deleteAllFromRealm();
            realm.commitTransaction();
        }        
    }
}

#5. Mở và đóng  Realm Instances

Với SQLite, bạn gọi hàm

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
1 hoặc
apply plugin: 'com.android.application'
apply plugin: 'realm-android'
2 nếu muốn tạo một thể hiện của SQLiteDatabase khi truy xuất cơ sở dữ liệu

With Realm, cũng tương tự, bạn gọi

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
3 để khởi tạo phiên bản của Realm

Tương tự với SQLite, khi bạn kết thúc việc truy xuất vào cơ sở dữ liệu thì nên đóng nó lại để nhớ giải nén

public void onDestroy() {
    if (!realm.isClosed()) {
        realm.close();
    }
    super.onDestroy();
}

#6. Cách thêm dữ liệu vào Realm database trong Android

Để thêm dữ liệu mới vào cơ sở dữ liệu Realm trong Android, bạn sử dụng Realm Managed Object. Để đạt được hiệu quả hơn, các đối tượng này phải được đính kèm trong một giao dịch

Ví dụ, đây là cách để lưu một Trích dẫn vào cơ sở dữ liệu

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
0

#7. Truy xuất để lấy dữ liệu từ Realm database

Truy vấn lấy dữ liệu trong Realm rất đơn giản và hiệu suất cũng rất tốt

Để truy vấn trong Realm, chúng ta sử dụng Fluent interface để xây dựng các câu truy vấn với nhiều điều kiện khác nhau. Bạn có thể xây dựng truy vấn lệnh bằng String hoặc sử dụng RealmQuery để xây dựng truy vấn lệnh

Kết quả truy vấn lệnh sẽ được trả về dưới dạng

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
4, trong đó
apply plugin: 'com.android.application'
apply plugin: 'realm-android'
5 là một lĩnh vực được quản lý

Các đối tượng Realm được chứa trong RealmResult là các đối tượng trực tiếp. Bạn có thể thoải mái đọc các giá trị của bất kỳ đối tượng kỳ lạ nào nhận được. Tuy nhiên, nếu muốn cập nhật thì cần phải thực hiện lại thông tin qua một giao dịch

Mình ví dụ đoạn code truy vấn cơ sở dữ liệu để lấy tất cả các quote

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
3

#số 8. Trong kiến ​​trúc MVP thì thao tác với Realm sẽ code như thế nào?

Một trong những tính năng mạnh mẽ nhất của Realm database trong Android là tính năng động. Dữ liệu (đối tượng) được tự động cập nhật

Nghĩa là khi một dữ liệu (hay nói cách khác là đối tượng) bị thay đổi, nó lập tức được cập nhật vào đĩa và thông báo cho tất cả người nghe của đối tượng đó. Đây lại là một vấn đề khi muốn áp dụng một kiến ​​trúc như MVP khi sử dụng Realm

Lý do là mỗi khi cập nhật vào Realm Managed lại cần một giao dịch. Nghĩa là bạn sẽ phải code việc cập nhật này trong Activity hay Fragment. Mà với MVP model, thì người ta lại muốn tách phần Model (thao tác với cơ sở dữ liệu) ra khỏi phần View(Activity/Fragment)

Tuy nhiên, is not must be no way. Mình sẽ phải cập nhật các đối tượng thủ công, thông qua các giao diện. Các bạn tham khảo đoạn mã bên dưới

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
4

Với các giao diện trên, đây là cách mình lưu Tác giả vào cơ sở dữ liệu

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
5

Với kiến ​​trúc MVP, tầng View tốt nhất là không cần quan tâm đến phía bên dưới sử dụng SQLite hay Realm. Như thế mới phát huy hết sức mạnh của kiến ​​trúc MVP

🔥 Đọc thêm. Explosion model MVP for setting Android application

Cuối cùng, các bạn có thể tham khảo toàn bộ mã nguồn của mình và xem ứng dụng chạy như thế nào nhé.

ĐẦY ĐỦ MÃ NGUỒN

Như vậy, mình đã hoàn thành bài viết hướng dẫn cơ bản về Realm database trong Android. Hi vọng các bạn sẽ cảm thấy bài viết có ích

Nếu có bất kỳ thắc mắc gì thì hãy comment bên dưới nhé

Hướng dẫn lĩnh vực mongodb

​Nhận sách ​Các tính năng nâng cao của Java

​Java là ngôn ngữ lập trình biến thế giới phổ biến nhất, là hình mẫu của tư tưởng OOP. Nếu bạn muốn bắt đầu với Java thì đây là cuốn sách không thể bỏ qua. Với 63 ví dụ thực thi, cùng với cách viết ngắn gọn dễ hiểu sẽ giúp bạn hiểu rõ bản chất của Java

​ Hiện Amazon đang bán với giá 16$, nhưng với VNTALKING thì miễn phí cho bạn. Còn chờ gì nữa?

TẢI XUỐNG

Hướng dẫn lĩnh vực mongodb

  • THẺ
  • Tự học lập trình android

Facebook

Twitter

liên kết

Pinterest

WhatsApp

Bài trước Bỏ từ khóa other trong hàm if. Có nên không?

Bài tiếp theo 5 lỗi thường gặp khi thiết lập trình Android

Hướng dẫn lĩnh vực mongodb

sơn dương

Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường đúng là xin được làm đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến ​​thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé