地图

Mapbox源码分析(6)数据库初始化

2020-02-23  本文已影响0人  一个观察世界的普通人

简介:

通过源码,我们来一步步分析Mapbox地图引擎初始化本地数据库的流程,这里是基于5.3.0的版本.

#### 注意

当我写这篇博客的时候,在官方changlog看到后续版本中对FileSource激活部分有做改动,这里暂时以现有版本为主,需要详细了解的同学可以下载新版本的源码了解

Mapbox提供了地图的离线下载存储功能,那么它是什么时候创建本地数据库的呢,我们看到NativeMapView的构造方法

这里我们看到它拿到了FileSource对象的实例,在这个类的注解中,我们知道它是负责激活本地数据源的,那么我们看看它的getInstance()方法

这里我们可以看出这是一个单例模式,我们看到它传入了一个缓存路径,那么这个路径会不会就是数据库存放的路径呢,我们继续往下看

这里我们看到它调用了底层的初始化方法,那么我们看看和这个对应的底层文件file_source.cpp

这里我们看到它在传入的路径后面加了"/mbgl-offline.db",这个路径果然是数据库路径,我们看到在这个构造方法中实例化了一个DefaultFileSource对象,那么我们看看DefaultFileSource对象的构造方法

这里我们发现他又初始化了它的Impl实现类,那么我继续看它的实现类

这里我们看到在它的构造方法中,又执行了initializeOfflineDatabase()方法,从这个方法名可以看出是初始化数据库,我们看到这个方法里面有实例化一个OfflineDatabase对象,我们看看这个对象

这里看出并未做什么,初始化值之后,便调用了ensureSchema()方法,我们看看这个方法

到这里基本就可以看出来了首先是通过connect()方法连接数据库,我们先看看connect()方法

这里我就把相关代码放一起了,我们看到connect()方法实例化了一个Database对象,并通过DatabaseImpl类调用sqlite3_open_v2()打开了一个数据库,那么和离线瓦片数据相关的表是怎么创建的呢,这里我们回到上面的ensureSchema()代码处,看到有这么一行

```c++

#include "offline_schema.cpp.include"

```

我们找到这个文件看看,我们找到该文件在 platform/default/mbgl/storage目录下

看到这里我们明白了,这里将相关创建表的语句定义成schema变量,通过#include引入到代码中,然后通过db->exec(schema)执行创建表,有关数据库初始化的过程就到这里了

上一篇下一篇

猜你喜欢

热点阅读