前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[058]SQLite on Android

[058]SQLite on Android

作者头像
王小二
发布2020-07-17 11:42:43
8980
发布2020-07-17 11:42:43
举报

前言

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、Native层
    • 1.1 libsqlite3_android
      • 1.2 libsqlite
        • 1.3 小结
        • 二、JNI-Jave层
          • 2.1 JNI层
            • 2.2 Java层
            • 三、Tencent开源WCDB
            • 总结
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档