androidstudio数据库 studio 在sqlite数据库怎么动态创建多张表

使用 Python 的 SQLite JSON1 和 FTS5 扩展
早在九月份,编程界出现一个名为 json1.c的文件,此前这个文件一直在 SQLite 的库里面。还有,笔者也曾总结通过使用新的 json1 扩展来编译 pysqlite的技巧。但现在随着 SQLite 3.9.0的发布,用户已经不用再费那么大劲了。
SQLite 3.9.0 版本做了很大的升级,不仅增加了万众期待的 json1 扩展,还增加了具有全文检索的新版本 fts5 扩展模块。 fts5 扩展模块提高了复杂查询的性能,并且提供了开箱即用的 BM25排序算法。该算法在其他相关领域排序方面也有着重大意义。使用者可通过查看发布说明以了解全部新增功能。
本文主要介绍如何添加 json1 和 fts5 扩展编译 SQLite。这里将使用新版 SQLite 库编译 python 驱动程序,也利用 python 新功能。由于个人很喜欢 pysqlite 和 apsw,所以下文步骤中将会包括建立两者的指令。最后,将在 peewee ORM 通过 json1 和 fts5 扩展进行查询。
首先从获取新版 SQLite 源码入手,一种方法是通过使用 SQLite 源代码管理系统 fossil 来完成,另一种是下载一个压缩图像。 SQLite 使用 tcl 和 awk 进行源码融合,因此在开始前,需要安装下列工具:
tclawk (可用于大多数 unix系统)fossil (可选)
该过程涉及几个步骤,这里尽量将步骤细化。首先需要为新库分配一个全新的目录,笔者把它放在 ~/bin/jqlite 中,使用者可根据个人喜好自行选择。
export JQLITE="$HOME/bin/jqlite" mkdir -p $JQLITE cd $JQLITE
通过 fossil 获取源码,运行以下命令:
fossil clone http://www.sqlite.org/cgi/src sqlite.fossil fossil open sqlite.fossil
获取快照文件,运行以下命令:
curl 'https://www.sqlite.org/src/tarball/sqlite.tar.gz?ci=trunk' | tar xz mv sqlite/* .
如果你更喜欢使用官方正式版,可在 SQLite 下载页下载 autoconf 的压缩包,并将内容解压到 $JQLITE 目录中。
利用 json1 和 fts5 编译 SQLite
代码下载完成后,把它和 SQLite 源代码树放在同一目录下。SQLite 支持大量的编译配置选项,除了 json1 和 fts5,还有很多其他有效的选择。
编译遵循典型的 configure -& make -& make install 顺序 :
export CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1 \ -DSQLITE_ENABLE_DBSTAT_VTAB=1 \ -DSQLITE_ENABLE_FTS3=1 \ -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 \ -DSQLITE_ENABLE_FTS5=1 \ -DSQLITE_ENABLE_JSON1=1 \ -DSQLITE_ENABLE_RTREE=1 \ -DSQLITE_ENABLE_UNLOCK_NOTIFY \ -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \ -DSQLITE_SECURE_DELETE \ -DSQLITE_SOUNDEX \ -DSQLITE_TEMP_STORE=3 \ -fPIC" LIBS="-lm" ./configure --prefix=$JQLITE --enable-static --enable-shared make make install
在 SQLite3 Source Checkout 中,应该有一个 lib/libsqlite3.a 文件。如果文件不存在,检查控制器的输出,查看错误日志。我在 arch 和 ubuntu 上都已执行成功,但 fapple 和 windoze 我不确定能否成功。
创建 pysqlite
大多数 python 开发者对 pysqlite一定不陌生,在 Python 标准库中 pysqlite 或多或少的和 sqlite3 模块相似。要建立和 libsqlite3 相对应的 pysqlite,唯一需要做的是修改 setup.cfg文件使其指向刚才创建的 include 和 lib 目录。
git clone /ghaering/pysqlite cd pysqlite/ cp ../sqlite3.c . echo -e "library_dirs=$JQLITE/lib" && setup.cfg echo -e "include_dirs=$JQLITE/include" && setup.cfg LIBS="-lm" python setup.py build_static
测试安装,进入 build/lib.linux-xfoobar/ 目录,启动 Python 解释器,运行以下命令:
&&& from pysqlite2 import dbapi2 as sqlite &&& conn = sqlite.connect(':memory:') &&& conn.execute('CREATE VIRTUAL TABLE testing USING fts5(data);') &pysqlite2.dbapi2.Cursor object at 0x7ff7d0a2dc60& &&& conn.execute('SELECT json(?)', (1337,)).fetchone() (u'1337',)
接下来就看你心情了,你可以运行 python setup.py 安装文件,也可以把新建的 pysqlite2(可在 build/lib.linux.../ 目录下查看)链接到 $PYTHONPATH。如果想同时使用 virtualenv 和 $PYTHONPATH ,可以先激活 virtualenv,然后返回 pysqlite 目录下运行 setup.py 来安装文件。
创建 apsw的步骤几乎和建立 pysqlite 相同。
cd $JQLITE git clone /rogerbinns/apsw cd apsw cp ../sqlite3{ext.h,.h,.c} . echo -e "library_dirs=$SQLITE_SRC/lib" && setup.cfg echo -e "include_dirs=$SQLITE_SRC/include" && setup.cfg LIBS="-lm" python setup.py build
为了测试新的 apsw 库,更改目录到 build/libXXX。启动 Python 解释器,运行下列命令:
&&& import apsw &&& conn = apsw.Connection(':memory:') &&& cursor = conn.cursor() &&& cursor.execute('CREATE VIRTUAL TABLE testing USING fts5(data);') &apsw.Cursor at 0x7fcf6b17fa80& &&& cursor.execute('SELECT json(?)', (1337,)).fetchone() (u'1337',)
可通过运行 Python setup.py 安装文件来安装新 apsw 全系统,或者链接 apsw.so 库(可在 build/lib.linux.../ 查看)到 $PYTHONPATH。如果开发者想同时使用 virtualenv 和 apsw,可以先激活 virtualenv,然后返回 apsw 目录下运行 setup.py 安装文件。
使用 JSON 扩展
json1 扩展中具有一些简洁特性,尤其是 json_tree 和 json_each 函数/虚拟表(详情)。为了展示这些新功能,本文特意利用 peewee(小型 Python ORM)编写了一些 JSON 数据并进行查询。
原打算从 GitHub 的 API 上获取测试数据,但为了展示最少冗长这个特性,特意选择编写一个小的 JSON 文件(详情)。其结构如下:
[{ "title": "My List of Python and SQLite Resources", "url": "/blog/my-list-of-python-and-sqlite-resources/", "metadata": {"tags": ["python", "sqlite"]} }, { "title": "Using SQLite4's LSM Storage Engine as a Stand-alone NoSQL Database with Python" "url": "/blog/using-sqlite4-s-lsm-storage-engine-as-a-stand-alone-nosql-database-with-python/", "metadata": {"tags": ["nosql", "python", "sqlite", "cython"]} }, ...]
如果更愿意以 IPython 格式查看代码,参考此处。
填充数据库
获取 JSON 数据文件和进行解码:
&&& import json, urllib2 &&& fh = urllib2.urlopen('/downloads/misc/blogs.json') &&& data = json.loads(fh.read()) &&& data[0] {u'metadata': {u'tags': [u'python', u'sqlite']}, u'title': u'My List of Python and SQLite Resources', u'url': u'/blog/my-list-of-python-and-sqlite-resources/'}
现在,需要告知 peewee 怎样去访问我们数据库,通过存入 SQLite 数据库的方式使用自定义的 pysqlite 接口。这里使用的是刚刚编译完成的 pysqlite2,虽然它和 tojqlite 有所混淆,但这并不冲突。在定义数据库类后,将创建一个内存数据库。(注:在接下来的2.6.5版本中,如果其使用比 sqlite3 更新版本编译,peewee 将自动使用 pysqlite2)。
&&& from pysqlite2 import dbapi2 as jqlite &&& from peewee import * &&& from playhouse.sqlite_ext import * &&& class JQLiteDatabase(SqliteExtDatabase): ... def _connect(self, database, **kwargs): ... conn = jqlite.connect(database, **kwargs) ... conn.isolation_level = None ... self._add_conn_hooks(conn) ... return conn ... &&& db = JQLiteDatabase(':memory:')
利用 JSON 数据填充数据库十分简单。首先使用单一 TEXT 字段创建一个通用表。此时,SQLite 不会显示 JSON 数据单独的列/数据类型,所以需要使用 TextField:
&&& class Entry(Model): ... data = TextField() ... class Meta: ... database = db ... &&& Entry.create_table() &&& with db.atomic(): ... for entry_json in data: ... Entry.create(data=json.dumps(entry_json)) ... JSON 的功能
首先介绍下 json_extract()。它通过点/括号的路径来描述要找的元素(postgres 使用的是[])。数据库的每个 Entry 中包含单一数据列,每个数据列中又包含一个 JSON 对象。每个 JSON 对象包括一个标题,一个 URL 和顶层的元数据键,下面是提取作品标题的代码:
&&& title = fn.json_extract(Entry.data, '$.title') &&& query = (Entry ... .select(title.alias('title')) ... .order_by(title) ... .limit(5)) ... &&& [row for row in query.dicts()] [{'title': u'A Tour of Tagging Schemas: Many-to-many, Bitmaps and More'}, {'title': u'Alternative Redis-Like Databases with Python'}, {'title': u'Building the SQLite FTS5 Search Extension'}, {'title': u'Connor Thomas Leifer'}, {'title': u'Extending SQLite with Python'}]
对应下面 SQL 创建的查询:
SELECT json_extract("t1"."data", '$.title') AS title FROM "entry" AS t1 ORDER BY json_extract("t1"."data", '$.title') LIMIT 5
在接下来的例子中,将提取包含特定标签的条目。利用 json_each() 函数搜索标签列表。该函数类似于表(实际指的是虚表),返回筛选后的指定 JSON 路径,下面是如何检索标题为「Sqlite」条目的代码。
&&& from peewee import Entity &&& tags_src = fn.json_each(Entry.data, '$.metadata.tags').alias('tags') &&& tags_ref = Entity('tags') &&& query = (Entry ... .select(title.alias('title')) ... .from_(Entry, tags_src) ... .where(tags_ref.value == 'sqlite') ... .order_by(title)) ... &&& [row for row, in query.tuples()] [u'Building the SQLite FTS5 Search Extension', u'Extending SQLite with Python', u'Meet Scout, a Search Server Powered by SQLite', u'My List of Python and SQLite Resources', u'Querying Tree Structures in SQLite using Python and the Transitive Closure Extension', u"Using SQLite4's LSM Storage Engine as a Stand-alone NoSQL Database with Python", u'Web-based SQLite Database Browser, powered by Flask and Peewee']
上述查询的 SQL 有助阐明整个过程:
SELECT json_extract("t1"."data", '$.title') AS title FROM "entry" AS t1, json_each("t1"."data", '$.metadata.tags') AS tags WHERE ("tags"."value" = 'sqlite') ORDER BY json_extract("t1"."data", '$.title')
随着查询变得更加复杂,可通过使用 Peewee 对象对查询进行封装,使之变得更加有用,同时也使得代码能够重用。
下面是 json_each() 的另一个例子。这次将筛选每个条目中的标题,并建立相关标签的字符串,字符串中用逗号分隔。这里将再次使用上文定义的 tags_src 和 tags_ref。
&&& query = (Entry ... .select( ... title.alias('title'), ... fn.group_concat(tags_ref.value, ', ').alias('tags')) ... .from_(Entry, tags_src) ... .group_by(title) ... .limit(5)) ... &&& [row for row in query.tuples()] [(u'A Tour of Tagging Schemas: Many-to-many, Bitmaps and More', u'peewee, sql, python'), (u'Alternative Redis-Like Databases with Python', u'python, walrus, redis, nosql'), (u'Building the SQLite FTS5 Search Extension', u'sqlite, search, python, peewee'), (u'Connor Thomas Leifer', u'thoughts'), (u'Extending SQLite with Python', u'peewee, python, sqlite')]
为了清晰起见,这里是对应的 SQL 查询语句:
SELECT json_extract("t1"."data", '$.title') AS title, group_concat("tags"."value", ', ') AS tags FROM "entry" AS t1, json_each("t1"."data", '$.metadata.tags') AS tags GROUP BY json_extract("t1"."data", '$.title') LIMIT 5
最后介绍的功能是 json_tree()。如同 json_each(),json_tree() 同样是一个多值函数,同样与表类似。但不同但时 json_each() 仅返回特定路径的 children,而 json_tree() 将递归遍历全部对象,返回全部的 children。
如果标签键嵌套在条目的任意位置,下面是如何匹配给定标签条目的代码:
&&& tree = fn.json_tree(Entry.data, '$').alias('tree') &&& parent = fn.json_tree(Entry.data, '$').alias('parent') &&& tree_ref = Entity('tree') &&& parent_ref = Entity('parent') &&& query = (Entry ... .select(title.alias('title')) ... .from_(Entry, tree, parent) ... .where( ... (tree_ref.parent == parent_ref.id) & ... (parent_ref.key == 'tags') & ... (tree_ref.value == 'sqlite')) ... .order_by(title)) ... &&& [title for title, in query.tuples()] [u'Building the SQLite FTS5 Search Extension', u'Extending SQLite with Python', u'Meet Scout, a Search Server Powered by SQLite', u'My List of Python and SQLite Resources', u'Querying Tree Structures in SQLite using Python and the Transitive Closure Extension', u"Using SQLite4's LSM Storage Engine as a Stand-alone NoSQL Database with Python", u'Web-based SQLite Database Browser, powered by Flask and Peewee']
在上述代码中选取了 Entry 自身,以及代表该 Entry 子节点的二叉树。因为每个树节点包含对父节点的引用,我们可以十分简单搜索命名为「标签」的父节点,该父节点包含值为「sqlite」的子节点。 下面是 SQL 实现语句:
SELECT json_extract("t1"."data", '$.title') AS title FROM "entry" AS t1, json_tree("t1"."data", '$') AS tree, json_tree("t1"."data", '$') AS parent WHERE ( ("tree"."parent" = "parent"."id") AND ("parent"."key" = 'tags') AND ("tree"."value" = 'sqlite')) ORDER BY json_extract("t1"."data", '$.title')
这仅是 json1 扩展功能的一个方面,在接下来的几周将会尝试使用其更多的功能。请在此处给我留言,或者如果对该扩展存在特定的问题,可通过邮件向 sqlite-users 咨询。
FTS5 与 Python
本小节中的代码均是之前 JSON 示例中的代码,这里将使用 Entry 数据文件的标题并且用它们填充搜索索引。peewee 2.6.5版本将包含 FTS5Model 功能,目前该功能可在 Github主分支上可用。
重新回到之前的 JSON 例子中去,新建另一张表,作为 Entry 数据的查询索引。
fts5 扩展要求所有的列不包含任何类型或约束。用于表示一列的唯一附加信息是无索引,意味着只能存储数据并不能进行数据查询。
对 entry 模型定义一个查询索引,以实现通过查询标题来确定相关的 URL。为此,需要将 url 字段定义为无索引。
class EntryIndex(FTS5Model): title = SearchField() url = SearchField(unindexed=True) class Meta: database = db options = {'tokenize': 'porter', 'prefix': '2,3'} EntryIndex.create_table()
对于 fts5 扩展,该可选字典提供了附加元数据进行标记字段,以及通过前缀的长度存储快速前缀查询。利用 SQL 创建表的语句如下:
CREATE VIRTUAL TABLE "entryindex" USING fts5 ( "title" , "url" UNINDEXED, prefix=2,3, tokenize=porter)
为了填充索引,将使用一对 JSON 函数从 Entry 模型中复制数据:
title = fn.json_extract(Entry.data, '$.title').alias('title') url = fn.json_extract(Entry.data, '$.url').alias('url') query = Entry.select(title, url).dicts() with db.atomic(): for entry in query: EntryIndex.create(**entry)
索引填充后,进行一些查询:
&&& query = EntryIndex.search('sqlite').limit(3) &&& for result in query: ... print result.title Extending SQLite with Python Building the SQLite FTS5 Search Extension My List of Python and SQLite Resources
实现上述查询的 SQL 语句为:
SELECT "t1"."title", "t1"."url" FROM "entryindex" AS t1 WHERE ("entryindex" MATCH 'sqlite') ORDER BY rank
同样可对查询后的结果进行检索:
&&& query = EntryIndex.search('sqlite AND python', with_score=True) &&& for result in query: ... print round(result.score, 3), result.title -1.259 Extending SQLite with Python -1.059 My List of Python and SQLite Resources -0.838 Querying Tree Structures in SQLite using Python and the Transitive Closure Extension
这些结果是非常准确,用于上述查询的 SQL 语句如下:
SELECT "t1"."title", "t1"."url", rank AS score FROM "entryindex" AS t1 WHERE ("entryindex" MATCH 'sqlite AND python') ORDER BY rank
本文中只是简要介绍了 fts5 扩展的简单功能,如果使用者查询该文档,将会发现其更多强大的功能。以下是一些例子:
多列索引,在排序时分配不同的权重前缀查询、引述语、相邻的行的关键词上述查询类型与布尔型运算符结合unicode61默认编码转化器、porter分解器禁止使用用于定义排序功能和断词的新的 C API。词汇表,用于查询词的数量和检查索引感谢阅读
在 SQLite 添加 JSON 扩展对该项目和用户来说都是一件好事。Postgresql 和 MySQL 都已支持 JSON 数据类型,很高兴能 SQLite 跟随他们的脚步。但并不是任何条件下均需要是 JSON 数据格式,例如某些情况下需要用到专用的嵌入式文件存储库 UnQLite。
json1.c 文件同样值得注意。Dr. Hipp 提到:json1.c 现在只是第一步,未来还有更多的发展空间。因此,无论当前版本存在任何问题,我始终坚信将来发布的版本中性能和 APIS 两个方面都会有很大的改善。还有一点,我相信他会考虑使用更高效的二进制格式。
很高兴看到 SQLite 在全文查询扩展模块上不断地自我完善和提高。为用户提供一个内置算法和一个用户可自行添加所需内容的 API。
原文地址:/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/
OneAPM 能够帮你查看 Python应用程序的方方面面,不仅能够监控终端的用户体验,还能监控服务器监性能,同时还支持追踪数据库、第三方 API 和 Web 服务器的各种问题。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点成都艾美互娱科技有限公司
Web前端开发工程师
职位编号:
招聘人数:1人
学历条件:大专
薪水范围:8-12K
职位有效期:短期
岗位职责:
负责APP的后台系统及内容发布系统的前端开发;
开发APP的运营管理后台系统,数据统计后台系统,财务统计后台系统及客服后台系统。
开发面向商家客户的店铺内容编辑发布系统。
协助开发以上系统中服务端部门功能
精通HTML(5)、CSS(3)、JAVA、Ajax等Web开发技术,熟练运用至少一款主流JS框架;
具备良好的前端架构分析能力与设计能力,对Web标准和标签语义化有深入理解,熟悉模块化开发;
有独立开发Node.js项目经验者优先考虑
Android工程师
职位编号:
招聘人数:1人
学历条件:大专
薪水范围:8-12K
职位有效期:短期
岗位职责:
负责android手机客户端软件的开发和维护
参与客户端产品的需求分析以及框架相关讨论
从事产品核心部分代码的开发,保证代码质量,保证完成进度
紧跟移动互联网技术发展方向,做好技术积累,对产品升级进行规划并推进实施;
熟悉Android SDK,并且开发过1-2款成熟产品 熟悉 Android Studio等开发工具;
对Android系统应用管理、内存管理机制有深入了解,能熟练处理各种权限请求;
有数据库开发经验,熟练使用SQLite数据库及相关框架;
熟练使用主流图片框架,深入理解其运作机制;
有音频视频多媒体相关功能开发经验者优先考虑;
数据库开发工程师
职位编号:
招聘人数:1人
学历条件:大专
薪水范围:12-25K
职位有效期:短期
岗位职责:
负责APP服务端及其后台管理系统的数据库架构的开发维护工作:
APP同时具备音视频娱乐类及电商类特性:
用户数据包含媒体文件信息,另外产品有自己的支付系统货币系统。
需通过使用缓存或搜索引擎等方式搭建兼顾高性能高可用的数据库架构:
用户及作品信息的多维度检索和推荐排序参数的统计计算操作侧重于考虑高性能;订单支付信息及账单数据的录入侧重于考虑高可用。
精通MySQL及Redis等主流关系型及非关系型数据库;
能够根据产品需求设计搭建高性能、高可用、可伸缩的数据库架构,并开展后续的维护及优化工作;
熟悉搜索引擎,有HBase+ElasticSearch或同类框架开发经验;
掌握成熟的数据备份方案及数据迁移方案。
有处理千万级以上用户量的产品数据经验。
我们还希望你具备以下特质:
思维缜密,有较强的需求分析能力。
善于沟通,与各部门高效协同工作。
自我驱动,积极乐观有责任心,与团队共同成长。
职位编号:
招聘人数:1人
学历条件:大专
薪水范围:10-14K
职位有效期:短期
岗位职责:
负责公司的iOS客户端产品的设计和研发
负责iOS平台客户端软件的开发和优化
研究新兴技术,满足产品需求
根据研发过程中的体验对产品提出建议
配合市场、运营等部门,提供产品的技术支持
计算机或相关专业本科及以上学历,3年以上iOS开发经验,有扎实的Objective-C语言基础,熟练掌握C/C++者优先,深入理解 iOS SDK,具有丰富的 Objective-C 或 C/C++ 开发经验
熟悉Objective-C Runtime和内存管理机制,
了解 GCD,熟练使用多线程、网络编程等技术
能实现较复杂的界面和视觉效果,处理好与数据的逻辑关系并保证稳定性
对CoreAnimation 有一定的了解,在自定义动画有实际经验者优先。
在内存优化,性能调优方面有实际经验者优先.
对移动产品有浓厚兴趣,对移动产品有较好的个人理解
职位编号:
招聘人数:1人
学历条件:本科
薪水范围:5-10K
职位有效期:短期
岗位职责:
招募统筹:根据公司发展的需求,制定年度招聘规划和人员编制预算,保障公司人才发展需求得到满足;
胜任管理:通过对员工的业绩和能力评价,协助业务部门提升员工技能,确保人岗匹配,同时通过内外部人才获取促进团队人的必要更新;
团队管理:团队问题分析诊断,包括团队建设、员工关怀、员工激励、文化宣导和融合、员工关系、人员优化等;
内部协同:根据公司规划,和相关部门保持有效沟通;
其他:负责公司基础财务及行政工作,协助CEO处理日常事务。
本科以上学历,3-5年人力资源工作经验,人力资源专业优先;
熟悉互联网行业;
熟悉劳动法律、法规及当地政策;
较强的管理能力,能协调内外资源,有较强的落地执行能力;
有良好的学习欲望和学习能力,抗压性强,善于沟通能力协调,做事积极主动,反应迅速。
公司介绍:
成都艾美互娱科技有限公司(简称:艾美互娱)
2013年,艾美踏上全新的音乐品牌征程。移动互联网化、社交化、O2O是艾美产品的战略关键词,也是这一时代下用户需求的首要指标。我们的责任不仅要创造精致优质的产品,还要给用户带来美妙绝伦的音乐享受,和精彩有趣的社交体验。2015年,艾美正在快速发展的阶段,产品不断更新迭代,合作伙伴也愈加庞大。
2017在成都成立研发中心,主要研发“咪达”客户端APP,这款应用主要集高视频制作、原创音乐分享、社交为一体的内容创作平台。以创造力为核心,以用户需求为驱动,以热爱音乐为意志,在冷静的智能行业之中,我们的团队赋予产品一种热爱生活的温度。
加入艾美,你得到的不仅是一份工作,还有和品牌一同茁壮的成就感,和音乐在一起的幸福感。
福利待遇:五险一金、免费KTV、聚会、零食
公司地址:成都市高新区天府三街福年广场
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点2017 Android GitHub 常用开源框架汇总
现在 GitHub 上流行的开源库极大地节省了开发者从 0 开发的时间,很多公司和个人都在 GitHub 上开源自己的项目,今天我们就来整理一下 Android 开发中一些非常流行的库,也是我们必须掌握的,这样可以使我们在使用到时快速的查找到,这里的总结基本也都是自己在开发中用到的,也就是一些个人的见解,只做参考,不具有权威性
一、网络库
1. Retrofit
Retrofit 是 Square 公司研发的网络请求库,也是目前 Android 最流行的 HttpClient 库之一,越来越多的公司开始使用这个请求库,并且可以完美结合 RxJava,就像官网介绍的一样,Retrofit 是一款类型安全的网络框架,基于 HTTP 协议,服务于 Android 和 Java 语言
GitHub 地址:Retrofit GitHub 地址
同样 okhttp 也是 Square 公司研发的网络请求库,是一款基于 HTTP 和 HTTP2.0 协议的网络框架,服务于 Java 和 Android 客户端,okhttp 以 21K 的 stars 排在 GitHub 中 android 子标题的第二名,很多公司都在使用,从 Retrofit 2.0 开始内置 okhttp 框架,Retrofit 专注封装接口完成业务需求,okhttp 专注网络请求的高效安全
GitHub 地址:okhttp GitHub 地址
Google 的 Andorid 开发团队也意识到有必要将 HTTP 的通信操作再进行简化,于是在 2013 年度的 Google I/O 大会上推出了一个新的网络通信框架—Volley,Volley 在性能方面进行了大幅度的调整,它是设计目标是适合进行数据量不大,但通信频繁的网络操作,对于数据量大的网络操作就会表现糟糕
GitHub 地址:volley GitHub 地址
网络方面的库我们就介绍上面主要用到的 3 个
二、图片加载库
在 Android 设备上面,快速高效的显示图片是极为重要的,在过去的很长时间里,我们在如何高效的存储图像这方面遇到了很多问题,例如图片太大,但是内存却比较小,但是越来越多优秀开源框架的使用解决了我们这方面的问题,接下来我们来看看这些优秀的开源框架
在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 glide 的图片加载框架,作者是 bumptech 这个库被广泛的应用在 Google 开源的项目中,包括 2014 年 Google I/O 大会上发布的官方 App
GitHub 地址:Glide GitHub 地址
一款管理图片内存的方案,是目前最强大的图片加载框架之一,facebook 的出身证明了它不是重复的制造轮子,在管理图片的内存上以及渐进式加载、加载 gif 都具有独有特性
GitHub 地址:Fresco GitHub 地址
3. picasso
非常强大的图片下载、缓存框架,picasso 更强调的是图片的下载,更重要的是这也是 square 团队的作品,想必提到 square 团队,它出片的东西我们还是非常的放心使用
GitHub 地址:picasso GitHub 地址
4. Android-Universal-Image-Loader
看到这个,想必有一定经验的 Android 开发者都会非常的熟悉,曾经的图片加载之王当之无愧,15.4k 的 stars 足以证明它的热门,与 glide 不同的是 UIL 提供了大量的配置方式,图片加载状态的回调,加载动画等,以及提供了移动端图片加载框架的缓存思路,三级缓存策略等
GitHub 地址:UIL GitHub 地址
5. PhotoView
一款 ImageView 展示框架,支持缩放,响应手势,位于图片排行榜的第五位,PhotoView 与上面不同的是图片的展示功能,可以实现类似微信头像的放大功能,还有就是很多 App 的图片显示响应手势按压式如何是现实的,这里 PhotoView 将都可以轻松实现
GitHub 地址:PhotoView GitHub 地址
6. CircleImageView
圆角 ImageView,在我们的 App 中这个想必是太常见了,也许我们可以有无数种展示圆角图片的方法,但是 CircleImageView 绝对是我们在开发时需要优先考虑的,如果你还不知道 CircleImageView,那么你需要赶快去体验它在处理圆角图片时的强大了,相信你肯定会觉得和 CircleImageView 相见恨晚,需要注意的是这个并不是图片加载库,暂且归类放在这里
GitHub 地址:CircleImageView GitHub 地址
关于图片加载库我们就介绍这 6 个,大家可以根据自己的特定情况来选择使用
1. material-dialogs
是一款自定义View框架,如多你还是一个自定义 View 的新人,对 Dialog 使用还有点生疏,那么通过使用 material-dialogs 可以提升你的 Dilaog 使用能力
GitHub 地址:material-dialogs GitHub 地址
2. flexbox-layout
是一款弹性伸缩布局,FlexboxLayout 作为 LinearLayout 和 RelativeLayout 的替代者,值得大家在项目开发中去尝试使用,毕竟是 Google 出品
GitHub 地址:flexbox-layout GitHub 地址
3. AndroidSwipeLayout
非常强大的滑动式布局,滑动删除是我们 app 中的常见需求,商品详情的上下滑动需求在实际开发中我们也是经常遇到,AndroidSwipeLayout 在 GitHub 上有 8300 个 stars,证明还是值得使用
GitHub 地址:AndroidSwipeLayout GitHub 地址
4. BaseRecyclerViewAdapterHelper
强大的通用 RecyclerView 适配器,在 GitHub Android 适配器排行榜第一
GitHub 地址:BaseRecyclerViewAdapterHelper GitHub 地址
5. MaterialDrawer
强大的材料风格的抽屉框架,非常灵活,易于使用
GitHub 地址:MaterialDrawer GitHub 地址
6. Android-ObservableScrollView
一款让视图滑动更具有视觉效果的滑动式框架,在 GitHub 上提供了 12 种滑动效果,可以用来提升 App 的滑动体验
GitHub 地址:Android-ObservableScrollView GitHub 地址
7. AppIntro
一款提供快速制作欢迎页的框架,在国内的 App 开发中,ViewPager 开发 App 的欢迎页已经是标配的需求,但是 AppIntro 也是绝对值得你一看
GitHub 地址:AppIntro GitHub 地址
8. ViewPagerIndicator
一款基于 ViewPager 的页面指示器开源框架,作者是 Android 大神 JakeWharton,只是已经很长时间没有更新了,大家可以参考使用
GitHub 地址:ViewPagerIndicator GitHub 地址
好了 UI 相关的库就介绍这么多,以后发现好用的会添加进来,方便查阅
1. lottie-android
动画类框架排行榜第一名,一款可以在 Android 端快速展示 Adobe Afeter Effect(AE) 工具所做动画的框架,利用 json 文 件快速实现动画效果是它最大的便利,而这个 json 文件也是由 Adobe 提供的 AE 工具制作的,在 AE 中装一个 Bodymovin 的插件,使用这个插件最终将动画效果生成 json 文件,这个 json 文件即可由 LottieAnimationView 解析并生成绚丽的动画效果,而且它还支持跨平台
GitHub 地址:lottie-android GitHub 地址
2. Material-Animations
一款提供场景转换过渡能力的动画框架,与 lottie-android 不同的是,Material-Animations 提供的是场景切换的动画效果
GitHub 地址:Material-Animations GitHub 地址
3. AndroidViewAnimations
一款提供可爱动画集的动画框架,在 lottie-android 和 Material-Animations 两个动画框架霸主之后排名第三,可见也是非常厉害
GitHub 地址:AndoridViewAnimations GitHub 地址
4. recyclerview-animators
为 recyclerview 提供扩展动画的框架,recyclerview 已经推出了很长时间,如果你还在使用 ListView,那就说明你老了
GitHub 地址:recyclerview-animators GitHub 地址
五、json 解析框架
1. fastjson
一款基于 json 解析、生成的框架,是阿里出品,这就保证了代码的质量,在网络请求时使用较多,值得尝试
GitHub 地址:fastjson GitHub 地址
六、内存泄露检测
1. leakcanary
一款内存检测框架,服务于 Java 和 Andorid 客户端,方便简洁是 leakcanary 最大的特点,只需要在应用的 apllication 中集成,就可以直接使用它,15.9k 的 stars 足够说明它的厉害,最关键是是,它也是 square 团队的作品,就这一条,不用说相信大家也都明白
GitHub 地址:leakcanary GitHub 地址
七、页面路由
1. ARouter
一款提供服务、页面跳转的路由框架,由阿里出品,该框架提供:从外部 URL 映射到内部页面、跨模块的页面跳转(模块化必备,页面解耦),拦截跳转过程等能力,绝对是一个企业级的开发框架
GitHub 地址:ARouter GitHub 地址
八、数据库框架
1. realm-java
Realm 是一款专门为移动端打造的数据库框架,比普通的数据库更快,力压 greenDAO
GitHub 地址:Realm GitHub 地址
2. greenDAO
greenDAO 是一款高效、快速的 SQLite 型数据库,star 数量和 Realm 不相上下,由 greenrobot 团队开发维护,此团队还有一个很牛的框架便是 EventBus
GitHub 地址:greenDAO GitHub 地址
RxJava 是 ReactiveExtensions 的 Java VM 实现:用于通过使用 observable 序列来组合异步和基于事件程序的库,它扩展观察者模式以支持数据/事件序列,并添加允许你以声明组合序列的操作符,同时提取对低级线程、同步、线程安全性和并发数据结构等问题的隐藏
GitHub 地址:RxJava GitHub 地址
2. RxAndroid
一款 Android 客户端组件间异步通信框架,位于通信框架排行榜的第二名,仅在 EventBus 之后,两者的区别是 EventBus 是用来取代组件之间繁琐的 Interface,而 RxAndroid 是用来取代 AnsyTask 的,两者并不冲突
GitHub 地址:RxAndroid GitHub 地址
Agera 是一组类和接口,可以帮组编写 Android 的功能,异步和无效应用程序,需要 Android SDK 版本 9 或更高,是 Google 官方出品
GitHub 地址:Agera GitHub 地址
4. RxBinding
一款提供 UI 组件事件响应能力的框架,通过 RxBinding 可以理解响应式编程的快乐,让项目的事件流程更加的清晰
GitHub 地址:RxBinding GitHub 地址
十、事件消息
1. EventBus
事件间通信框架 stars 第一,在大型项目的 Activities、Fragments、Threads、Services 都有使用场景,尽管 EventBus 在向未创建的组件传递事件时有些局限,仅适合在活着的组件之间传递消息,但任然不妨碍在各个大型项目的场景中使用
GitHub 地址:EventBus GitHub 地址
十一、图表
1. MPAndroidChart
MPAndroidChart 是一款图表框架,以快速、简洁,强大著称的图表框架,支持线条、饼型、气泡和烛台图,以及缩放、拖动和动画
GitHub 地址:MPAndroidChart GitHub 地址
十二、生成模板代码
1. butterknife
使用注解生成模板代码,将 view 与方法和参数绑定,配合 Android Studio 提供的 ButterKnife 插件,帮组开发者省却了频繁的 findViewById 的烦恼,最新的 ButterKnife 还提供了 onclick 绑定以及字符串的初始化,初学者可以查阅 ButterKnife 以及 ButterKnife 进一步学习,作者是 JakeWharton,是大名鼎鼎的 square 的团队成员之一
GitHub 地址:butterknife GitHub 地址
今天的总结就先到这里,后续会不断更新
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点}

我要回帖

更多关于 sqlite创建多张表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信