[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的读写速度,提升手机性能。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux系列之学会使用CURL命令
- 潘石屹用python解决100个问题 | 斐波那契数列
- [869]pandas的dataFrame的行列索引操作
- JSP的文件上传处理
- 将SAP CRM WebClient UI的表格导出成PDF
- java.lang.ClassNotFoundException org.w3c.dom.ElementTraversal
- docker一键部署SpringBoot项目
- 【Flutter 专题】95 图解 Dart 单线程实现异步处理之 Task Queue
- 首发基于OpenPAI细化部署 Hadoop 集群
- PhpStorm 集成 WSL 虚拟机中的 PHP 进行单元测试和代码调试
- 【CMake教程】(五)CMake 配置install打包
- 【CMake教程】(四)CMake 配置生成lib或者so的库文件
- 使用 GitHub README profile 展示更多信息
- 算法工程师-SQL进阶:集合之间的较量
- 算法工程师-SQL进阶:神奇的自连接与子查询