A cross platform plugin for Firebase Cloud Firestore. A wrapper for Xamarin.Firebase.iOS.CloudFirestore and Xamarin.Firebase.Firestore.
Install Nuget package to each projects.
- Add GoogleService-Info.plist to iOS project. Select BundleResource as build action.
- Initialize as follows in AppDelegate.
Plugin.CloudFirestore.CloudFirestore.Init();
- Add google-services.json to Android project. Select GoogleServicesJson as build action. (If you can't select GoogleServicesJson, reload this android project.)
- Initialize as follows in MainActivity.
Plugin.CloudFirestore.CloudFirestore.Init();
var document = await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.GetDocument("yourdocument")
.GetDocumentAsync();
var yourModel = document.ToObject<YourModel>();
var query = await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.WhereGreaterThan("Value", 100)
.OrderBy("Value", false)
.LimitTo(3)
.GetDocumentsAsync();
var yourModels = query.ToObjects<YourModel>();
await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.AddDocumentAsync(new YourModel());
await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.GetDocument("yourdocument")
.UpdateDataAsync(new Dictionary<string, object> { ["Value"] = 20 });
await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.GetDocument("yourdocument")
.DeleteDocumentAsync();
var reference = CrossCloudFirestore.Current
.GetCollection("yourcollection")
.GetDocument("yourdocument");
await CrossCloudFirestore.Current.RunTransactionAsync((transaction) =>
{
var document = transaction.GetDocument(reference);
var yourModel = document.ToObject<YourModel>();
yourModel.Value++;
transaction.UpdateData(reference, yourModel);
});
var batch = CrossCloudFirestore.Current.CreateBatch();
var reference = CrossCloudFirestore.Current
.GetCollection("yourcollection")
.GetDocument("yourdocument");
var yourModel = new YourModel();
batch.SetData(reference, yourModel);
yourModel.Value++;
batch.UpdateData(reference, yourModel);
await batch.CommitAsync();
CrossCloudFirestore.Current.GetCollection("yourcollection")
.GetDocument("yourdocument")
.AddSnapshotListener((snapshot, error) =>
{
//...
});
CrossCloudFirestore.Current
.GetCollection("yourcollection")
.AddSnapshotListener((snapshot, error) =>
{
if(snapshot != null)
{
foreach (var documentChange in snapshot.DocumentChanges)
{
switch (documentChange.Type)
{
case DocumentChangeType.Added:
// Document Added
break;
case DocumentChangeType.Modified:
// Document Modified
break;
case DocumentChangeType.Removed:
// Document Removed
break;
}
}
}
});
Use of Reactive Extensions
CrossCloudFirestore.Current.GetCollection("yourcollection")
.GetDocument("yourdocument")
.AsObservable()
.Subscribe(document =>
{
//...
});
// Added
CrossCloudFirestore.Current
.GetCollection("yourcollection")
.ObserveAdded()
.Subscribe(document =>
{
//...
});
// Modified
CrossCloudFirestore.Current
.GetCollection("yourcollection")
.ObserveModified()
.Subscribe(document =>
{
//...
});
// Removed
CrossCloudFirestore.Current
.GetCollection("yourcollection")
.ObserveRemoved()
.Subscribe(document =>
{
//...
});
This library can map native data to .NET data and .NET data to native data.
// native to .NET
var yourModel = document.ToObject<YourModel>();
// .NET to native
await CrossCloudFirestore.Current
.GetCollection("yourcollection")
.AddDocumentAsync(new YourModel());
Firestore Type | .NET Type |
---|---|
Array | System.Collections.IList |
Boolean | bool and bool? |
Byte | byte[] and Stream |
Date and time | DateTime, DateTimeOffset and these Nullable |
Floating-point number | float, double, decimal and these Nullable |
Geographical point | Plugin.CloudFirestore.GeoPoint |
Integer | byte, sbyte, short, ushort, int, uint, long, ulong and these Nullable |
Map | System.Collections.IDictionary and Any Class |
Null | null |
Reference | Plugin.CloudFirestore.IDocumentReference |
Text string | string |
You can specify attributes to data class properties.
public class YourModel
{
[Id]
public string Id { get; set; }
[MapTo("value")]
public int Value { get; set; }
[Ignored]
public string Text { get; set; }
}
Document id is set when mapping from native. When mapping to native, specified properties are ignored.
Specified name becomes Firestore field name.
Specified properties are ignored for mapping.