sqlite如何在android中使用文件作为数据库

时间:2013-01-17 06:31:28

标签: android database sqlite

我想知道当你在android上处理数据库时sqllite究竟是如何工作的。我知道它用.db扩展名写入文件。但它如何读取或写入一个特定的表?它是获取整个文件还是仅获取相关部分以及它是如何完成这些操作的?有人可以建议我一些链接吗?我试过谷歌,但我找到的链接只解释了如何编写查询。

2 个答案:

答案 0 :(得分:1)

为此您必须阅读数据库的基础知识。 所有db框架在工作方面几乎相同 你必须研究数据库的基础知识(任何)。 这里有一些你可以喜欢的相关信息

What does a database actually do to find out what matches a select statement?

说实话,这是一个蛮力的问题。简单地说,它读取数据库中的每个候选记录并将表达式与字段匹配。所以,如果你有“select * from table where name ='fred'”,它会逐字遍历每条记录,抓住“name”字段,并将其与'fred'进行比较。

现在,如果“table.name”字段被编入索引,那么数据库将(可能但不一定)首先使用索引来定位候选记录以应用实际过滤器。

这减少了应用表达式的候选记录的数量,否则它将只执行我们称之为“表扫描”的操作,即读取每一行。

但从根本上说,它定位候选记录与它应用实际过滤器表达式的方式是分开的,显然,可以做一些聪明的优化。

How does a database interpret a join differently to a query with several "where key1 = key2" statements?

好吧,连接用于创建一个新的“伪表”,应用过滤器。因此,您有过滤条件和连接条件。连接标准用于构建此“伪表”,然后对其应用过滤器。现在,在解释连接时,它再次与过滤器相同 - 强制比较和索引读取以构建“伪表”的子集。

How does the database store all its memory?

良好数据库的关键之一是它如何管理其I / O缓冲区。但它基本上将RAM块与磁盘块匹配。使用现代虚拟内存管理器,更简单的数据库几乎可以依赖VM作为其内存缓冲管理器。高端DB'自己完成这一切。

How are indexes stored?

B +树通常,您应该查找它。这是一种已经存在多年的直接技术。它的好处是与大多数平衡树共享:对节点的一致访问以及所有叶节点都是链接的,因此您可以按键顺序轻松地从一个节点遍历到另一个节点。因此,使用索引,可以将行视为对数据库中的特定字段进行“排序”,并且数据库可以利用该信息使其有利于优化。这与使用索引的哈希表不同,后者只允许您快速访问特定记录。在B树中,您不仅可以快速获取特定记录,还可以快速获取排序列表中的某个点。

在数据库中存储和索引行的实际机制非常简单且易于理解。游戏是管理缓冲区,并将SQL转换为有效的查询路径,以利用这些基本的存储习惯用法。

然后,在存储习惯用语之上存在整个多用户,锁定,日志记录和事务复杂性。

答案 1 :(得分:0)

Android上的SQLite操作与任何其他平台上的SQLite操作没有任何不同。

您的问题答案非常简短:SQLite文件被拆分为固定大小的页面。 每个数据库对象(表,索引等)占用一定数量的页面。如果对象需要增长(就像将新行插入表中那样),它可以从空闲页面列表或通过增大数据库文件大小来分配更多新页面。如果删除行或删除对象,则回收的可用空间将进入空闲页面列表。在任何操作期​​间,SQLite引擎都会尝试不获取整个文件,但它会维护页面缓存以获得更高的性能。

您可以在SQLite website上找到更详细的解释,尤其是SQLite database file format