前言
SQLite是移动端常用的数据库,我们就来简单介绍一下SQLite在Android上的体系结构。
一、Native层
首先我们先从Native层将起,也就是SQLite最核心的实现,整个代码目录结构如下:
代码语言:javascript复制├── android
│ ├── Android.bp
│ ├── NOTICE
│ ├── OldPhoneNumberUtils.cpp
│ ├── OldPhoneNumberUtilsTest.cpp
│ ├── PhoneNumberUtils.cpp
│ ├── PhoneNumberUtils.h
│ ├── PhoneNumberUtilsTest.cpp
│ ├── sqlite3_android.cpp
│ └── sqlite3_android.h
├── Android.bp
├── CleanSpec.mk
├── dist
│ ├── Android.bp
│ ├── Android.patch
│ ├── MODULE_LICENSE_PUBLIC_DOMAIN
│ ├── NOTICE
│ ├── orig
│ │ ├── shell.c
│ │ ├── sqlite3.c
│ │ ├── sqlite3ext.h
│ │ └── sqlite3.h
│ ├── README-Android
│ ├── shell.c
│ ├── sqlite3.c
│ ├── sqlite3ext.h
│ └── sqlite3.h
├── OWNERS
├── README.version
└── UPDATE-SOURCE.bash
1.1 libsqlite3_android
增加了一些手机号码比较的功能在sqlite3中,libsqlite3_android是一个静态库,将会打包进libsqlite这个动态库。
代码语言:javascript复制├── android
│ ├── Android.bp
│ ├── NOTICE
│ ├── OldPhoneNumberUtils.cpp
│ ├── OldPhoneNumberUtilsTest.cpp
│ ├── PhoneNumberUtils.cpp
│ ├── PhoneNumberUtils.h
│ ├── PhoneNumberUtilsTest.cpp
│ ├── sqlite3_android.cpp
│ └── sqlite3_android.h
1.2 libsqlite
代码语言:javascript复制├── dist
│ ├── Android.bp
│ ├── Android.patch
│ ├── MODULE_LICENSE_PUBLIC_DOMAIN
│ ├── NOTICE
│ ├── orig
│ │ ├── shell.c
│ │ ├── sqlite3.c
│ │ ├── sqlite3ext.h
│ │ └── sqlite3.h
│ ├── README-Android
│ ├── shell.c
│ ├── sqlite3.c
│ ├── sqlite3ext.h
│ └── sqlite3.h
可能你会好奇一个目录下为什么会有两份代码sqlite3的代码,看看README-Android就明白了。 简单来说就是Android在orig目录下的sqlite3代码基础上加了一些定制化的功能,可以查看Android.patch,查看修改点。
代码语言:javascript复制SQLite on Android
The Android port of SQLite contains a few customizations.
They are immortalized in Android.patch to ease future upgrades.
This file can be regenerated using:
(for x in orig/*; do diff -u -d $x ${x#orig/}; done) > Android.patch
1.3 小结
会有人说,原来sqlite3实现那么简单,就这么4个文件,其实整个sqlite3.c有20万行代码,接近7.5MB的,从现代的软件设计理念来说完全是不可接受的,有兴趣的仔细看看。
二、JNI-Jave层
其实正常情况下我们完全可以只用libsqlite就可以进行数据库的操作,但是为了方便广大Java开发人员使用sqlite3,肯定实现JNI-Java层。
2.1 JNI层
代码语言:javascript复制frameworks/base/core/jni
├── android_database_CursorWindow.cpp
├── android_database_SQLiteCommon.cpp
├── android_database_SQLiteCommon.h
├── android_database_SQLiteConnection.cpp
├── android_database_SQLiteDebug.cpp
├── android_database_SQLiteGlobal.cpp
2.2 Java层
代码语言:javascript复制frameworks/base/core/java/android/database/sqlite
├── DatabaseObjectNotClosedException.java
├── package.html
├── SQLiteAbortException.java
├── SQLiteAccessPermException.java
├── SQLiteBindOrColumnIndexOutOfRangeException.java
├── SQLiteBlobTooBigException.java
├── SQLiteCantOpenDatabaseException.java
├── SQLiteClosable.java
├── SQLiteCompatibilityWalFlags.java
├── SQLiteConnection.java
├── SQLiteConnectionPool.java
├── SQLiteConstraintException.java
├── SQLiteCursorDriver.java
├── SQLiteCursor.java
├── SQLiteCustomFunction.java
├── SQLiteDatabaseConfiguration.java
├── SQLiteDatabaseCorruptException.java
├── SQLiteDatabase.java
├── SQLiteDatabaseLockedException.java
├── SQLiteDatatypeMismatchException.java
├── SQLiteDebug.java
├── SQLiteDirectCursorDriver.java
├── SQLiteDiskIOException.java
├── SQLiteDoneException.java
├── SQLiteException.java
├── SQLiteFullException.java
├── SQLiteGlobal.java
├── SQLiteMisuseException.java
├── SQLiteOpenHelper.java
├── SQLiteOutOfMemoryException.java
├── SQLiteProgram.java
├── SQLiteQueryBuilder.java
├── SQLiteQuery.java
├── SQLiteReadOnlyDatabaseException.java
├── SQLiteSession.java
├── SQLiteStatementInfo.java
├── SQLiteStatement.java
├── SQLiteTableLockedException.java
├── SQLiteTokenizer.java
├── SQLiteTransactionListener.java
└── SqliteWrapper.java
三、Tencent开源WCDB
WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,SQLCipher又是基于SQLite。
总结
我们可以想办法将一部分WCDB或者SQLCipher的功能移植到Android上的SQLite,来提升SQLite的读写速度,提升手机性能。