File sinkronisasi default ranah

Mempelajari cara menggunakan Realm Mobile Platform.

Saya membuat aplikasi iOS kecil yang berhasil menyimpan data ke server dan datanya konsisten di berbagai perangkat. Aplikasi ini sangat mirip dengan tutorial resmi dunia.

Saya dapat membuka URL Sinkronisasi dari Aplikasi Realm Browser Mac dan saya melihat perubahannya terjadi dengan baik secara real-time. Di sinilah saya terjebak: Saya mencoba melihat perubahan pada file ranah lokal, tetapi

print(self.realm.configuration.fileURL) mengembalikan nihil print(Realm.Configuration.defaultConfiguration.fileURL) adalah file kosong

Ini kode saya:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    DispatchQueue.main.async {
        // Open Realm
        let configuration = Realm.Configuration(
            syncConfiguration: SyncConfiguration(
                user: user,
                realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!)
            )

        self.realm = try! Realm(configuration: configuration)

        // Show initial tasks
        func updateList() {
            self.items = Array(self.realm.objects(Row.self))
            self.tableView.reloadData()
        }

        updateList()

        print(self.realm.configuration.fileURL) 
        //returns nil

        print(Realm.Configuration.defaultConfiguration.fileURL) 
        // I can open the file, but it's empty

        // Notify us when Realm changes
        self.notificationToken = self.realm.addNotificationBlock { _ in
            updateList()
        }
}

Alasan saya menguji ini adalah agar saya dapat memuat data dari file, bukan dari server. Sehingga: (a) login hanya akan dipanggil satu kali (b) data tersedia saat pengguna sedang offline.


person j_theislander    schedule 21.02.2017    source sumber
comment
Bisakah Anda memberikan rincian tentang kecelakaan itu? yaitu, bagaimana cara mereproduksinya, dll? Tentu saja, sinkronisasi tidak dapat terjadi saat perangkat offline, namun Anda masih memiliki akses ke data yang telah disinkronkan sebelum offline. Aplikasi harus online saat melakukan otentikasi pengguna awal.   -  person teotwaki    schedule 27.02.2017
comment
@teotwaki Sepertinya saya belum menjawab pertanyaan saya dengan benar. Maaf untuk itu. Untuk mengulanginya: Saya mendapat kesan bahwa menggunakan ROS akan membuat file realme pada disk yang dicerminkan. Setelah bereksperimen lebih lanjut, saya membuat file realm yang akan berada di perangkat, dan kemudian mendorong perubahan ke file realm lain di server setiap kali terjadi perubahan. Ranah di server untuk tujuan pencadangan, sedangkan file di disk adalah yang offline utama. Saya tidak yakin apakah ini praktik yang baik/buruk, namun saya akan memposting eksperimen saya setelah selesai untuk mendapatkan masukan. Banyak terimakasih untuk balasanmu.   -  person j_theislander    schedule 27.02.2017
comment
Tidak ada konsep Realm di server. Anda selalu mengerjakan file lokal, bahkan untuk pertanyaan/modifikasi. Jika file diaktifkan sinkronisasinya, riwayatnya akan direplikasi di server, yang memungkinkan klien lain mengunduh riwayat dan merakit kembali Realm secara lokal. Anda pada dasarnya melakukan hal yang sama yang disediakan ROS secara manual.   -  person teotwaki    schedule 27.02.2017
comment
Oke! Membatalkan eksperimen saya. ???? Akan diuji lagi besok. Apakah sinkronisasi file diaktifkan secara default?   -  person j_theislander    schedule 27.02.2017
comment
Itu jika Anda membuka Realm dengan syncURL.   -  person teotwaki    schedule 27.02.2017
comment
Default.realm tetap kosong. Saya menyusun ulang pertanyaan awal saya dengan cara yang lebih masuk akal - menurut saya.   -  person j_theislander    schedule 28.02.2017


Jawaban (1)


Saat Anda masuk untuk pertama kalinya, Realm secara otomatis menyimpan pengguna di gantungan kunci. Anda kemudian dapat mengambilnya melalui properti SyncUser.currentUser dan menggunakannya untuk membuka wilayah Anda meskipun Anda sedang offline. Namun jika Anda mengeluarkan pengguna maka Anda tidak akan dapat menggunakannya secara offline.

realm.configuration.fileURL tidak tersedia saat menggunakan syncConfiguration.


Untuk kasus ini:

  1. Hubungi SyncUser.logIn hanya sekali
  2. Untuk menjalankan aplikasi normal (yaitu semua proses kecuali proses awal), buka area dengan konfigurasi yang sama.

Anda harus memiliki sesuatu seperti ini:

// First launch
if launchedBefore == false {
    setupRealm()

// All other launches
} else if launchedBefore == true {
    let user = SyncUser.current!
    openRealm(forUser: user)
}

openRealm(forUser: SyncUser) pada dasarnya sama dengan seluruh blok pengiriman dari kode sebelumnya.

setupRealm()bisa memanggilnya juga untuk membersihkan kode:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    self.openRealm(forUser: user)
}
person Dmitry    schedule 28.02.2017
comment
Maaf saya kurang mengikuti. Saat ini default.realm kosong. Apakah ini terisi secara otomatis setelah saya menggunakan SyncUser.currentUser? Dan bagaimana cara yang tepat untuk membukanya dalam kasus ini? - person j_theislander; 28.02.2017
comment
@Jalal Anda menentukan URI untuk Realm yang Anda buka, sehingga nama file akan berbeda dari default.realm. default.realm hanya digunakan ketika Anda menggunakan konstruktor default (yaitu: let realm = Realm()). Harap dicatat bahwa saat membuka Realm yang disinkronkan, lokasi file lokal disembunyikan dari Anda. Anda sebaiknya tidak mencoba mengaksesnya secara manual. - person teotwaki; 28.02.2017
comment
@teotwaki Wah terima kasih! Komentar Anda membantu saya melihat kesalahan pendekatan pengujian saya. - person j_theislander; 01.03.2017