在数据库中存储包含列表<>的自定义对象

时间:2018-06-20 11:56:15

标签: c# android list object xamarin

我想将类/对象保存到Android中的本地SQLite数据库。但是此对象包含一个列表。据我所知,不可能将列表保存到数据库中,因此我想忽略它,并在从数据库中加载对象后填充它。

我一直在查看有关Android数据库的多个教程,但是没有一个教程涵盖如何处理无法存储在数据库中的属性。

我还查看了xamarin文档,并尝试使用[ignore]失败了。

xamarin documentation

这是我想在[ignore]仍然存在的情况下保存到数据库的类:

[Table("Room")]
public class Room
{
    [PrimaryKey, AutoIncrement]
    public int id { get; set; }

    public string RoomName { get; set; }

    public string NFC_UId { get; set; }

    [Ignore]
    public List<Switch> RoomSwitches = new List<Switch>();

    public Room()
    {

    }
}

当我尝试使用忽略时收到的错误是:

  

严重性代码描述项目文件行抑制状态   错误CS0592在此声明类型上,属性“忽略”无效。它仅对“属性,索引器”声明有效。

那么有可能忽略该列表,或者有其他解决方案来解决我的问题吗?

2 个答案:

答案 0 :(得分:0)

如果您正在使用android architectures中的Room,则可以在TypeConverters的帮助下将GSON添加到数据库中,类似于@ Wheels73建议的内容。例如,您可以将类型转换器编写为:

class ListTypeConverter {

    @TypeConverter fun fromStringToList(stringValue: String?) : List<String>? {
        val listType = object: TypeToken<List<String>>(){}.type
        return if(stringValue?.isNotEmpty == true) {
            Gson().fromJson(stringValue, listType)
        } else null
    }

    @TypeConverter fun fromListToString(listValue: List<String>?) : String? =
        Gson().toJson(listValue ?: return null)

}

并将此TypeConverter添加到您的数据库定义中:

@TypeConverters(ListTypeConverter::class) // add additional using ,
class MyAppDatabase : RoomDatabase() {
    // retrieve your DAOs
}

如果您不使用ROOM。这个想法是相似的,使用GSON并将对象与String之间进行转换,以创建列表并将其保存为字段。我认为它在C#中也将类似。我不太熟悉,但也许您可以使用

var listString = JsonConvert.SerializeObject(listOfObjectType)

var listOfObject = JsonConvert.DeserializeObject<List<ObjectType>>(listString)

答案 1 :(得分:0)

原来我不得不像这样使用[ignore]:

public ActionResult SendFamilyMembers(AddFamilyMembersViewModel model)
{
        logger.Trace(model.FamilyMembers[0].Name);//<----- Null reference
}

我现在正在使用会议室类中的一个函数(标记为<---)从数据库加载会议室之后获取开关。