美文网首页
[058]SQLite on Android

[058]SQLite on Android

作者: 王小二的技术栈 | 来源:发表于2020-07-16 14:22 被阅读0次

    前言

    SQLite是移动端常用的数据库,我们就来简单介绍一下SQLite在Android上的体系结构。

    一、Native层

    首先我们先从Native层将起,也就是SQLite最核心的实现,整个代码目录结构如下:

    ├── 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这个动态库。

    ├── android
    │   ├── Android.bp
    │   ├── NOTICE
    │   ├── OldPhoneNumberUtils.cpp
    │   ├── OldPhoneNumberUtilsTest.cpp
    │   ├── PhoneNumberUtils.cpp
    │   ├── PhoneNumberUtils.h
    │   ├── PhoneNumberUtilsTest.cpp
    │   ├── sqlite3_android.cpp
    │   └── sqlite3_android.h
    

    1.2 libsqlite

    ├── 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,查看修改点。

    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层

    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层

    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的读写速度,提升手机性能。

    相关文章

      网友评论

          本文标题:[058]SQLite on Android

          本文链接:https://www.haomeiwen.com/subject/pxouqktx.html