4

我正在构建一个 Xamarin 移动应用程序,并且我有一组从 rest api 获得的产品。每个产品可以有 n 个图像。我已经使用 SQLite-Net Extensions 设置了表的关系。但是,当我将值插入数据库时​​,图像字段在产品表中的值为空,而图像表为空。

我的模特

    public class Product
{
    [SQLite.Net.Attributes.PrimaryKeyAttribute]
    public int ID { get; set; }
    public string Name { get; set; }
    [OneToMany] 
    public List<Image> Images { get; set; }
}

public class Image
{
    [SQLite.Net.Attributes.PrimaryKeyAttribute, SQLite.Net.Attributes.AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Product))]     // Specify the foreign key
    public int ProductID { get; set; }
    public string Link { get; set; }
}

我用来插入值的代码。

var db = new SQLiteConnection(new SQLitePlatformAndroid(), path);
var info = db.GetTableInfo("ProductDB");
db.CreateTable<ProductDB>();
db.CreateTable<ImageDB>();
db.DeleteAll<ProductDB>();
db.DeleteAll<ImageDB>();
db.InsertAllWithChildren(data);
db.UpdateAll(data);

这就是我将json反序列化为对象的方式

public async Task<List<ProductDB>> GetAllProducts()
    {
        var httpClient = GetHttpClient();

        var response = await httpClient.GetAsync(ServiceEndPoints.GetFilmsUri).ConfigureAwait(false);

        if (response.IsSuccessStatusCode)
        {
            var content = response.Content;

            string jsonString = await content.ReadAsStringAsync().ConfigureAwait(false);

            return JsonConvert.DeserializeObject<List<ProductDB>>(jsonString);
        }
        return null;
    }

如果有人可以帮助我确定我做错了什么,那就太好了。

4

2 回答 2

1
db.InsertAllWithChildren(data);
db.UpdateAll(data); 

您插入带有子值的值,然后使用相同的值进行更新,其中 ProductID 值被更新为 null,因为它们应该由数据库设置。如果你想更新你的数据,你应该为每个被插入的项目设置外键,或者使用 UpdateWithChildren

于 2016-03-14T15:42:11.960 回答
1

我猜那data是一个List<Product>. 在这种情况下,您只是在数据库中插入产品,没有插入图像。

您有两个选择:手动插入图像或使用递归操作。


要手动插入图像,只需在插入产品之前InsertAll使用所有图像调用方法:

List<Image> images = data.SelectMany(p => p.Images ?? new List<Image>());
conn.InsertAll(images);
conn.InsertAllWithChildren(data);

使用递归操作更简单,但需要少量配置。CascadeOperation通过设置关系属性的属性来启用级联操作:

[OneToMany(CascadeOperations = CascadeOperation.All)] 
public List<Image> Images { get; set; }

然后,您可以设置recursive任何-WithChildren方法的参数true来执行级联操作:

conn.InsertAllWithChildren(data, recursive: true);
于 2016-03-14T17:28:07.987 回答