Я предполагаю, что в любой момент времени вы хотите кэшировать только часть базы данных сервера в локальном приложении и что кэшированные данные могут со временем меняться.
Вы, вероятно, хотите использовать объекты-заглушки для представления связанных объектов, которые вы еще не загрузили. Вы должны настроить объекты следующим образом:
Expense{
date:Date
cost:Number
account<<-->AccountStub.expenses
}
AccountStub{
id:Number
expenses<-->>Expenses.account
}
Account:AccountStub{
name:String
address:String
}
У сущности AccountStub есть минимальная минимальная информация, необходимая для идентификации учетной записи в БД сервера на основе информации, предоставленной из таблицы расходов. Он служит в качестве заполнителя в графе объектов для полноценного объекта Account (вы можете рассматривать его как тип ошибки, если хотите.)
Поскольку расходы связаны с AccountStub, а Account наследуется от AccountStub, вы можете при необходимости заменить Account на AccountStub (и наоборот).
Вам потребуется предоставить собственный подкласс для AccountStub и Account, чтобы AccountStub мог инициировать загрузку данных учетной записи и создание объекта Account, когда эти данные действительно требуются. Затем новый объект Account должен быть заменен на AccountStub во всех его отношениях (для этого может потребоваться много кода).
Для использования вы должны сначала получить данные для объекта Расходы и создать этот объект. Вы попытаетесь получить AccountStub с идентификатором, предоставленным из данных таблицы расходов. Установите выборку для включения подстатей. Если объект AccountStub или Account существует с этим идентификатором, вы добавите объект Expense в отношение. Если нет, вы создаете объект AccountStub с этим идентификатором и добавляете его в отношение. Теперь у вас есть базовый граф объектов, показывающий связь объекта Expense с объектом AccountStub. Чтобы получить доступ к данным учетной записи Расхода, вы должны сначала проверить, является ли связанная учетная запись тупой или полной учетной записью. Если это заглушка, то перед загрузкой необходимо загрузить полные данные учетной записи.
Преимущество этой системы в том, что вы можете поддерживать довольно сложный граф объектов, не имея фактически всех данных локально. Например. Вы можете поддерживать несколько отношений и ходить эти отношения. Например, вы можете расширить свою модель следующим образом:
AccountStub{
id:Number
expenses<-->>Expenses.account
owner<<--AccountOwnerStub.accounts
}
AccountOwnerStub{
id:Number
accounts<-->>AccountStub.owner
}
AccountOwner{
name:String
address:String
bill:Number
}
Если вы хотите найти имя владельца учетной записи объекта Expense, вы просто проведете отношения по заглушкам с помощью account.owner.name
сам объект Account останется просто заглушкой.
Если вам нужно сохранить комнату локально, вы можете вернуть объект обратно в заглушку, не ставя под угрозу график.
Это потребует некоторой работы, и вам придется следить за заглушками, но это позволит вам зеркалировать сложную внешнюю БД без необходимости хранить все данные под рукой.