MonoTouch CoolStorage OneToMany缓存问题

时间:2013-04-19 20:16:08

标签: iphone ios sqlite xamarin.ios coolstorage

我遇到CoolStorage的问题,当第一次读取列表时,正在缓存OneToMany关系,该列表在数据稍后更改时无法更新。

重新启动我的应用程序时,列表是正确的,因此它必须是缓存问题,我无法在CoolStorage文档或任何地方找到解决方案。

我已粘贴下面的单元测试代码。

我有一个Game类,其中包含Person类型的对手。有许多游戏,一个人可以成为许多游戏的对手。

我的Person类有一个名为OpponentGames的CSList,所以在任何时候我都可以说'得到这个人是对手的游戏'。

在第一次引用'person.OpponentGames.Count'的单元测试中,它正确告诉我有一个游戏。在创建第二个游戏并将我的人物添加为对手之后,它仍会为OpponentGames报告一个游戏。

如果我删除了第一个计数,则测试通过,因此第一个检查结果正在被缓存,并且从那里它没有更新。

我将非常感谢任何建议!感谢。

SQL (sqlite3)设置:

CSDatabase.ExecuteNonQuery(
    "CREATE TABLE Person " +
    "(ServerId INTEGER PRIMARY KEY)");

CSDatabase.ExecuteNonQuery(
    "CREATE TABLE Game " +
    "(ServerId INTEGER PRIMARY KEY," +
    "OpponentId INTEGER REFERENCES User(ServerId))");

CoolStorage .Net课程:

[MapTo("Game")]
public class Game : CSObject<Game,int>
{
    //[PrimaryKey]
    public int ServerId { get { return (int) GetField("ServerId"); } set { SetField("ServerId", value); } }

    [ManyToOne (LocalKey="OpponentId", ForeignKey="ServerId")]
    public Person Opponent { get { return (Person) GetField("Opponent"); } set { SetField("Opponent", value); } }
}

[MapTo("Person")]
public class Person : CSObject<Person,int>
{
    //[PrimaryKey]
    public int ServerId { get { return (int) GetField("ServerId"); } set { SetField("ServerId", value); } }

    [OneToMany (LocalKey="ServerId", ForeignKey="OpponentId")]
    public CSList<Game> OpponentGames { get { return (CSList<Game>) GetField("OpponentGames"); } }
}

最后,单元测试:

// user

Person person = Person.New ();
person.ServerId = 1;

// first game

Game game = Game.New ();
game.ServerId = 1;
game.Opponent = person;

game.Save ();
person.Save ();

// this line correctly returns 1, removing this passes the test

Console.WriteLine ("count0: " + person.OpponentGames.Count);

// second game

Game game2 = Game.New ();

game2.ServerId = 2;
game2.Opponent = person;

game2.Save ();
person.Save ();

// this incorrectly shows 1, should be 2

Console.WriteLine ("count1: " + person.OpponentGames.Count);

// and it fails

Assert.True (person.OpponentGames.Count == 2);

0 个答案:

没有答案