簡介:
通過源碼,我們來一步步分析Mapbox地圖引擎初始化本地數(shù)據(jù)庫的流程箭窜,這里是基于5.3.0的版本.
#### 注意
當(dāng)我寫這篇博客的時候彩郊,在官方changlog看到后續(xù)版本中對FileSource激活部分有做改動,這里暫時以現(xiàn)有版本為主毒坛,需要詳細(xì)了解的同學(xué)可以下載新版本的源碼了解
Mapbox提供了地圖的離線下載存儲功能,那么它是什么時候創(chuàng)建本地數(shù)據(jù)庫的呢林说,我們看到NativeMapView的構(gòu)造方法
這里我們看到它拿到了FileSource對象的實(shí)例,在這個類的注解中煎殷,我們知道它是負(fù)責(zé)激活本地數(shù)據(jù)源的,那么我們看看它的getInstance()方法
這里我們可以看出這是一個單例模式腿箩,我們看到它傳入了一個緩存路徑豪直,那么這個路徑會不會就是數(shù)據(jù)庫存放的路徑呢,我們繼續(xù)往下看
這里我們看到它調(diào)用了底層的初始化方法珠移,那么我們看看和這個對應(yīng)的底層文件file_source.cpp
這里我們看到它在傳入的路徑后面加了"/mbgl-offline.db"弓乙,這個路徑果然是數(shù)據(jù)庫路徑,我們看到在這個構(gòu)造方法中實(shí)例化了一個DefaultFileSource對象钧惧,那么我們看看DefaultFileSource對象的構(gòu)造方法
這里我們發(fā)現(xiàn)他又初始化了它的Impl實(shí)現(xiàn)類暇韧,那么我繼續(xù)看它的實(shí)現(xiàn)類
這里我們看到在它的構(gòu)造方法中,又執(zhí)行了initializeOfflineDatabase()方法浓瞪,從這個方法名可以看出是初始化數(shù)據(jù)庫懈玻,我們看到這個方法里面有實(shí)例化一個OfflineDatabase對象,我們看看這個對象
這里看出并未做什么乾颁,初始化值之后涂乌,便調(diào)用了ensureSchema()方法,我們看看這個方法
到這里基本就可以看出來了首先是通過connect()方法連接數(shù)據(jù)庫英岭,我們先看看connect()方法
這里我就把相關(guān)代碼放一起了湾盒,我們看到connect()方法實(shí)例化了一個Database對象,并通過DatabaseImpl類調(diào)用sqlite3_open_v2()打開了一個數(shù)據(jù)庫诅妹,那么和離線瓦片數(shù)據(jù)相關(guān)的表是怎么創(chuàng)建的呢罚勾,這里我們回到上面的ensureSchema()代碼處,看到有這么一行
```c++
#include "offline_schema.cpp.include"
```
我們找到這個文件看看,我們找到該文件在 platform/default/mbgl/storage目錄下
看到這里我們明白了荧库,這里將相關(guān)創(chuàng)建表的語句定義成schema變量堰塌,通過#include引入到代碼中,然后通過db->exec(schema)執(zhí)行創(chuàng)建表分衫,有關(guān)數(shù)據(jù)庫初始化的過程就到這里了