【问题标题】:Xamarin Forms SQLLite add OneToOne and OneToMany subobjects to dbXamarin Forms SQLLite 将 OneToOne 和 OneToMany 子对象添加到 db
【发布时间】:2020-11-30 21:55:06
【问题描述】:

我正在尝试创建一个持久的 sqllite 数据库(安装应用程序后创建表,卸载应用程序时删除数据库)

我有一个问题,例如我无法保存我的子对象

 public class ObjectInstanceResponseModel : GenericResponseModel
    {
        public ObservableCollection<ObjectInstanceData> ObjectInstances { get; set; }
    }
    public class ObjectInstanceData : GenericResponseModel
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [JsonProperty("idObjectinstance")]
        public int IdObjectInstance { get; set; }

        [JsonProperty("objectclass_idObjectclass")]
        public int ObjectClassIdObjectClass { get; set; }

        [JsonProperty("objectclassname")]
        public string ObjectClassName { get; set; }

        [JsonProperty("visibilitylevel")]
        public int VisibilityLevel { get; set; }

        [JsonProperty("showname")]
        public bool ShowName { get; set; }

        [JsonProperty("showicon")]
        public bool ShowIcon { get; set; }

        [JsonProperty("creationtime")]
        public DateTimeOffset CreationTime { get; set; }

        [JsonProperty("users_idUsers")]
        public int UsersIdUsers { get; set; }

        [JsonProperty("isfavorite")]
        public bool? IsFavorite { get; set; }

        [OneToMany("ObjectInstanceDataStrings")]
        [JsonProperty("strings")]
        public List<String> Strings { get; set; }

    }

    public class String
    {
        [PrimaryKey, AutoIncrement]
        [JsonProperty("idObjectparameterstring")]
        public int? IdObjectParameterString { get; set; }

        [ForeignKey(typeof(ObjectInstanceData))]
        public int ObjectInstanceDataStrings { get; set; }

        [JsonProperty("stringvalue")]
        public string StringValue { get; set; }

        [JsonProperty("objectparameterset_idObjectparameterset")]
        public int? ObjectParameterSetIdObjectParameterSet { get; set; }

        [JsonProperty("showinballon")]
        public bool? ShowInBallon { get; set; }

        [JsonProperty("idClassparameter")]
        public int IdClassParameter { get; set; }

        [JsonProperty("classparametername")]
        public string ClassParameterName { get; set; }
    }

所以,我的类 String 始终为空,尽管表中有一些行是我创建的 Strings.. 我需要延迟加载吗?

我通过 app.cs 中的依赖服务实现了 sqllite,如下所示:

public partial class App : Application
{
    public static SQLiteConnection DatabaseConnection { get; set; }
    
    public App()
    {
        
        InitializeComponent();

        DatabaseConnection = DependencyService.Get<IConnection>().GetConnection();
        CreateTables();
        
    }

    private void CreateTables()
    {
        DatabaseConnection.CreateTable<ObjectInstanceData>();
        DatabaseConnection.CreateTable<Models.Objects.String>();
    }
        

    protected override void OnStart()
    {
    }
    protected override void OnSleep()
    {
    }

    protected override void OnResume()
    {
    }
}

所以,基本上逻辑应该是当没有互联网时,使用 sql lite(保留本地更改),当互联网回来时,上传保存在数据库中的更改,并从表中删除数据。 您注意到我使用 api 的响应模型。

所以,我从我的 FavoriteObjectViewModel 调用这个:

var response = await ApiServiceProvider.GetObjectInstances(null, true);

并在 ApiServiceProvider 中:

public static async Task<ObjectInstanceResponseModel> GetObjectInstances(string queryString = null, bool? onlyFavorites = null)
{
    HttpResponseMessage response;

    response = await apiClient.GetAsync(objectInstancesEndpoint);

    var resultContent = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<ObservableCollection<ObjectInstanceData>>(resultContent);

    objectInstanceResponse.ObjectInstances = result;

    //after each api call I need to update db

    //delete previous data, and add fresh data from api
    App.DatabaseConnection.DeleteAll<ObjectInstanceData>();
    
    foreach (var item in result)
    {
        App.DatabaseConnection.Insert(item);
        if (item.Strings != null && item.Strings.Count > 0)
        App.DatabaseConnection.InsertAll(item.Strings);
    }

    //I only get the data for ObjectInstanceData, Strings model is empty!
    var objectsResponseDb = App.DatabaseConnection.GetAllWithChildren<ObjectInstanceData>();
    
    objectInstanceResponse.Succeeded = true;

    return objectInstanceResponse;
}

所以,我的问题是:

  • 如果我每次都在 App.cs 中创建表是不是意味着当用户退出应用程序并重新进入时我不存储数据?
  • 为什么模型Strings是空的?当我调用var strings = App.DatabaseConnection.GetAllWithChildren&lt;Models.Objects.String&gt;(); 时,我可以看到有数据?
  • 进行离线“记录”的最佳方法是什么?也许 sqllite 有更好的 nuget?

【问题讨论】:

    标签: sqlite xamarin xamarin.forms


    【解决方案1】:

    我对持久性数据库了解不多,但我可以肯定地告诉你一件事:你的方法是错误的。

    1. 您应该为数据库的逻辑创建一个单独的类,例如创建表和实例化连接以及其他操作数据的方法。
    2. 在 App 类中,您可以创建数据库类的静态资源,您可以调用它并使用其中的方法。 我不太擅长解释,但这是一个非常基本的示例,说明它的外观:https://docs.microsoft.com/en-us/xamarin/get-started/tutorials/local-database/?tutorial-step=2&tabs=vswin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多