我们正在设计一款Android应用程序,其中包含大量数据("客户"、"产品"、"订单"等),我们不想每次需要某条记录时都查询SQLite。 我们希望尽可能避免频繁地查询数据库,因此决定始终将某些数据保存在内存中。
我们最初的想法是创建两个简单的类:
1. "MemoryRecord": 一个类,它基本上包含一个对象数组(字符串、整数、双精度、日期时间等),这些是来自表记录的数据,以及从该数组中获取/输出这些数据的所有方法。 2. "MemoryTable": 一个类,它基本上包含[键,MemoryRecord]映射和操纵此映射以及将记录插入/更新/从数据库中删除的所有方法。
这些类将派生到我们在数据库中拥有的各种类型的表中。 当然还有其他有用的方法,但在这一点上它们并不重要。
因此,在启动应用程序时,我们将使用这些类将这些表从SQLite数据库加载到内存中,并且每当我们需要更改某些数据时,我们将在内存中进行更改,然后立即将其发布到数据库中。
但是,我们希望您提供帮助/建议。 您能否建议实现此类事情更简单或更有效的方法? 或者已经为我们执行此操作的现有类?
我理解您们正在尝试向我展示什么,并为此表示感谢。
但是,假设我们有一张表包含2000条记录,我需要列出这些记录。 对于每个记录,我必须查询其他30个表(其中一些具有1000条记录,其他具有10条记录)以在列表中添加其他信息,而此时它正在"飞行"(如您所知,在此刻我们必须非常快)。
现在你可能会说:"只需使用所有这些'连接'构建主查询,并在一个步骤中带来所有需要的内容。 如果您的数据库设计良好等,则SQLite可以非常快..."。
我们最初的想法是创建两个简单的类:
1. "MemoryRecord": 一个类,它基本上包含一个对象数组(字符串、整数、双精度、日期时间等),这些是来自表记录的数据,以及从该数组中获取/输出这些数据的所有方法。 2. "MemoryTable": 一个类,它基本上包含[键,MemoryRecord]映射和操纵此映射以及将记录插入/更新/从数据库中删除的所有方法。
这些类将派生到我们在数据库中拥有的各种类型的表中。 当然还有其他有用的方法,但在这一点上它们并不重要。
因此,在启动应用程序时,我们将使用这些类将这些表从SQLite数据库加载到内存中,并且每当我们需要更改某些数据时,我们将在内存中进行更改,然后立即将其发布到数据库中。
但是,我们希望您提供帮助/建议。 您能否建议实现此类事情更简单或更有效的方法? 或者已经为我们执行此操作的现有类?
我理解您们正在尝试向我展示什么,并为此表示感谢。
但是,假设我们有一张表包含2000条记录,我需要列出这些记录。 对于每个记录,我必须查询其他30个表(其中一些具有1000条记录,其他具有10条记录)以在列表中添加其他信息,而此时它正在"飞行"(如您所知,在此刻我们必须非常快)。
现在你可能会说:"只需使用所有这些'连接'构建主查询,并在一个步骤中带来所有需要的内容。 如果您的数据库设计良好等,则SQLite可以非常快..."。
好的,但是这个查询将变得非常复杂,即使SQLite非常快,它也会变得“太”慢(我已经确认为2到4秒,这对我们来说是不可接受的)。
另一个麻烦是,根据用户的交互,我们需要“重新查询”所有记录,因为涉及的表不同,我们必须与另一组表“重新连接”。
因此,另一种选择是仅带有主要记录(这永远不会改变,无论用户做什么或想要什么),不进行连接(这非常快!),并在每次需要一些数据时查询其他表。请注意,在只有10条记录的表中,我们将多次抓取相同的记录。在这种情况下,这是浪费时间,因为无论SQLite有多快,查询、游标、抓取等操作总是比从某种“内存缓存”中获取记录更昂贵。我想澄清的是,我们不打算始终在内存中保留所有数据,只是某些我们经常查询的表。
然后我们来到了最初的问题:最佳的“缓存”这些记录的方法是什么?我真的很想专注于这个讨论而不是“为什么需要缓存数据?”
View
,以便更容易地进行简单查询。(http://www.sqlite.org/lang_createview.html)尽管在SQLite中视图是只读的,但它仍然非常有用。将其视为具有计算列的表,但完全与原始数据表保持最新。 - Jelle