1

我试图在我的 Xamarin 项目中从 SQLite 更改为 Realm.io,但在 ID 上找不到任何自动增量。我找到了一篇关于 Java 的帖子,其中包含以下内容:

int nextID = (int) (realm.where(dbObj.class).maximumInt("id") + 1);

在 Xamarin 中没有位置,但我尝试了这个:

realm.All<DebitorPlateDBModel> ().Max (x => x.Id + 1);

遗憾的是“Max”不被支持。

有人在这方面取得成功吗?

4

3 回答 3

2

有不同的方法可以实现这一点,它只取决于最适合您的模型的方法,这里有几个:

测试型号:

public class IdIntKeyModel : RealmObject
{
    [Indexed]
    public int ID { get; set; }
    public string Humanized { get; set; }
}

无间隙键排序(通过Count):

注意:适用于初始批量导入

注意:假设只有一个线程添加记录,并且您的记录 ID 没有间隙,即没有重新排序键的删除等...

var config = RealmConfiguration.DefaultConfiguration;
config.SchemaVersion = 1;
using (var theRealm = Realm.GetInstance("StackoverFlow.realm"))
{
    var key = theRealm.All<IdIntKeyModel>();
    theRealm.Write(() =>
    {
        for (int i = 1; i < 1000; i++)
        {
            var model = theRealm.CreateObject<IdIntKeyModel>();
            model.ID = key.Count() + 1;
            model.Humanized = model.ID.ToWords();
            System.Diagnostics.Debug.WriteLine($"{model.ID} : {model.Humanized}");
        }
    });
    var whatIsTheKey = theRealm.All<IdIntKeyModel>().OrderBy(modelKey => modelKey.ID).Last();
    System.Diagnostics.Debug.WriteLine($"{whatIsTheKey.ID} : {whatIsTheKey.Humanized}");
}

Gap'ie 键排序(通过 indexed 重新获取最后一条记录ID):

注意:“Gap'ie”正在申请商标 ;-)

var rand = new Random();
var config = RealmConfiguration.DefaultConfiguration;
config.SchemaVersion = 1;
using (var theRealm = Realm.GetInstance("StackOverflow.realm"))
{
    theRealm.Write(() =>
    {
        for (int i = 1; i < 1000; i++)
        {
            var lastID = theRealm.All<IdIntKeyModel>().OrderByDescending(modelKey => modelKey.ID).FirstOrDefault();
            var model = theRealm.CreateObject<IdIntKeyModel>();
            model.ID = lastID != null ? lastID.ID + rand.Next(10) : 1; // use lastID.ID++ for normal code flow, using rand.Next as a test to check ID indexing
            model.Humanized = model.ID.ToWords();
        }
    });
    var lastKey = theRealm.All<IdIntKeyModel>().OrderBy(modelKey => modelKey.ID).Last();
    System.Diagnostics.Debug.WriteLine($"{lastKey.ID} : {lastKey.Humanized}");
}

注意:基于添加的支持的代码更新FirstOrDefault,测试 w/v0.78.1

于 2016-09-27T13:41:01.997 回答
0

“在 Xamarin 中没有哪里”是不正确的 - 我们支持 LINQ,正如您在主页上的片段中看到的那样。

但是,您正确的,我们(还)没有自动增量或任何用于该角色的东西。

我们会在某个时候得到一些东西,但由于同步问题,它不会是auto-increment,而是类似auto-unique-id.

我们刚刚发布了带有同步功能的完整移动平台(Xamarin 即将实现)。Realm Object Server 的一大亮点是与编辑离线数据的人打交道,然后与其他 Realm 进行高度可靠的同步。

没有办法让简单的自动增量适用于断开连接的数据创建(我第一次处理这个问题是在 1996 年的 Mac 上,但物理定律没有改变,我们只是停止使用软盘) .

于 2016-09-27T15:12:02.163 回答
0

Realm 实际支持 where 子句。您只需要导入 linq。但是,自动递增 id 确实很重要。

我通过创建自己的 id 解决了自动增量问题

using Realms;
using System;

namespace RealmDatabase
{
  public class RealmUserObject : RealmObject
  {
    [PrimaryKey]
    public int userID { get; set; }
    public string userLoginName { get; set; }
    public DateTimeOffset userCreated { get; set; }
    public bool userActive { get; set; }
  }
}

然后在添加帐户时,我从领域获取最后一个用户信息,然后从中获取最后一个 id(即 int ),然后在插入新帐户之前 + 1。

public List<RealmUserObject> getAllUserAccountsFromDatabase()
{
    try
    {
        realm = Realm.GetInstance(config);
        return realm.All<RealmUserObject>().Last();
    }
    catch (Exception) { throw; }
}

我正在调用整个帐户,因为它在其他情况下对我有用。但你实际上可以像这样直接问你想要什么

return realm.All<RealmUserObject>().Last().userID;

注意:当然问题是如果你没有任何记录存在,那么只需插入它并将 id 初始设置为 1 并在 account 大于 0 时输入 else

于 2016-12-14T10:42:40.420 回答