[058]SQLite on Android

时间:2022-07-22
本文章向大家介绍[058]SQLite on Android,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

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