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):

注: 最初の一括インポートに適しています

注:レコードを追加するスレッドが 1 つだけで、レコード 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、テスト済みv0.78.1

于 2016-09-27T13:41:01.997 に答える
0

where 句は Realm で実際にサポートされています。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にし、アカウントが0より大きい場合はelseにすることです

于 2016-12-14T10:42:40.420 に答える
0

「Xamarin には場所がありません」は正しくありません。ホームページのスニペットでわかるように、LINQ をサポートしています。

ただし、(まだ) 自動インクリメントやその役割のための機能がないことは間違いありません。

ある時点で何かを取得しますが、同期の問題によりauto-increment、 ではなく、 のようなものになりauto-unique-idます。

同期機能を備えた完全なモバイル プラットフォームをリリースしたばかりです (Xamarin は準備中です)。Realm Object Server の重要な点の 1 つは、オフライン データを編集し、他の Realm との信頼性の高い同期を行っている人々を扱うことです。

単純な自動インクリメントを切断されたデータ作成で機能させる方法はありません (これを最初に扱ったのは 1996 年に Mac でしたが、物理法則は変わっていません。フロッピー ディスクの使用をやめただけです)。 .

于 2016-09-27T15:12:02.163 に答える