精华内容
下载资源
问答
  • Android 系统提供媒体库 URI 与 数据库的对应关系 前言 MediaProvider queryUri uri ...附MediaStore Uri 与 数据库对应表仅供参考Android 系统提供媒体库 URI 与 数据库的对应关系前言在 Android 系统

    Android 系统提供媒体库 URI 与 数据库的对应关系

    前言

    在 Android 系统中,本地媒体(e.g. 音乐)文件会被检索并且以 数据库 的形式进行保存管理,在开发 Android 程序的时候,我们可以使用 ContentProvider 设置 uri 去获取相关的数据1
    在使用 ContentProvider 组件的时候,通常的做法是继承父类 ContentProvider,然后重载父类中 inser()delete()update()query() 等方法实现对数据的操作2
    既然本地媒体文件在系统中是以 数据库 的形式来管理,并且提供了 uri 供我们使用,那么我猜在系统内部应该是有个 ***Provider 的去实现对 数据库 的操作。
    通过 Google 和 Baidu 找到了相关名词——MediaProvider,并且找到了源码3

    MediaProvider

    public class MeidaProvider extends ContentProvider {
        private static final Uri MEDIA_URI = Uri.parse("content://media");
        private static final Uri ALBUMART_URI = Uri.parse("content://media/external/audio/albumart");
    
    ...
    
    }

    我想这个 MeidaProvider.class 也许会给我们想要的线索,因为使用 ContentResolver 获取本地音乐中,使用的 uricontent://media/external/audio/media ,而这个 class 也出现了类似的字段。
    MeidaProvider extends ContentProvider 那么应该会 重载 ContentProvider 的相关方法以向外提供数据操作方法。而在查询音乐数据使用的方法为 query(Uri uri, ...) 传入一个 uri ,所以先查看 query( ) 的内容。

    query(Uri uri, …)

    //MediaProvider.class:1813
       public Cursor query(Uri uri, String[] projectionIn, String selection, String[] selectionArgs, String sort) {
            int table = URI_MATCHER.match(uri);
    
            ...
    
            String groupBy = null;
            DatabaseHelper helper = getDatabaseForUri(uri);
    
            ...
    
            switch (table) {
    
                ...
    
                case AUDIO_MEDIA:
                    if (projectionIn != null && projectionIn.length == 1 &&  selectionArgs == null
                            && (selection == null || selection.equalsIgnoreCase("is_music=1")
                              || selection.equalsIgnoreCase("is_podcast=1") )
                            && projectionIn[0].equalsIgnoreCase("count(*)")
                            && keywords != null) {
                        //Log.i("@@@@", "taking fast path for counting songs");
                        qb.setTables("audio_meta");
                    } else {
                        qb.setTables("audio");
                        for (int i = 0; keywords != null && i < keywords.length; i++) {
                            if (i > 0) {
                                qb.appendWhere(" AND ");
                            }
                            qb.appendWhere(MediaStore.Audio.Media.ARTIST_KEY +
                                    "||" + MediaStore.Audio.Media.ALBUM_KEY +
                                    "||" + MediaStore.Audio.Media.TITLE_KEY + " LIKE ? ESCAPE '\\'");
                            prependArgs.add("%" + keywords[i] + "%");
                        }
                    }
                    break;
                case AUDIO_MEDIA_ID:
                    qb.setTables("audio");
                    qb.appendWhere("_id=?");
                    prependArgs.add(uri.getPathSegments().get(3));
                    break;
    
                ...
    
        }
    
    //MediaProvider.class:4716
     static
        {
            ...
    
            URI_MATCHER.addURI("media", "*/audio/media", AUDIO_MEDIA);
            URI_MATCHER.addURI("media", "*/audio/media/#", AUDIO_MEDIA_ID);
            URI_MATCHER.addURI("media", "*/audio/media/#/genres", AUDIO_MEDIA_ID_GENRES);
    
            ...
        }

    从以上代码可以看出,在 query( ) 中,使用 URI_MATCHER.match(uri) 对传入的 uri 进行解析,然后在 switch( )setTables( ) 设置对应的表或者视图。

    getDatabaseForUri(uri);

    //MediaProvider.java:4456
    private DatabaseHelper getDatabaseForUri(Uri uri) {
        synchronized (mDatabases) {
            if (uri.getPathSegments().size() >= 1) {
                    return mDatabases.get(uri.getPathSegments().get(0));
                }
            }
            return null;
        }
    
    //MediaProvider.java:4490
    private Uri attachVolume(String volume) {
        //将 “db” 路径判断存入 “mDatabases”
    }
    

    MediaProvider.onCrearte() 被创建启动的时候会查看是否有外置存储器,并执行 attachVolume() 方法(:508),将内外置存储器中的数据库路径存入 mDatabases

    Uri

    通用资源标识符(Uniform Resource Identifier)4

    URI是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。在ContentProvider机制中,使用ContentResolver对象通过URI定位ContentProvider提供的资源。
    ContentProvider使用的URI语法结构如下:

    content://<authority>/<data_path>/<id>
    • content:// 是通用前缀,表示该UIR用于ContentProvider定位资源。
    • < authority > 是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此一般< authority >都由类的小写全称组成,以保证唯一性。
    • < data_path > 是数据路径,用来确定请求的是哪个数据集。如果ContentProvider近提供一个数据集,数据路径则可以省略;如果ContentProvider提供多个数据集,数据路径必须指明具体数据集。数据集的数据路径可以写成多段格式,例如people/girl和people/boy。
    • < id > 是数据编号,用来唯一确定数据集中的一条记录,匹配数据集中_ID字段的值。如果请求的数据不只一条,< id >可以省略。

    如请求整个people数据集的URI为:

    content://com.example.peopleprovider/people

    而请求people数据集中第3条数据的URI则应写为:

    content://com.example.peopleprovider/people/3

    URI_MATCHER.addURI( );

    Add a URI to match, and the code to reutrn when this URI is matched. URI nodes may be exact match string, the token “*” that matches any text, or the token “#” that matches only numbers.5

    //MediaProvider.class:4716
     static
        {
            ...
    
            URI_MATCHER.addURI("media", "*/audio/media", AUDIO_MEDIA);
            URI_MATCHER.addURI("media", "*/audio/media/#", AUDIO_MEDIA_ID);
            URI_MATCHER.addURI("media", "*/audio/media/#/genres", AUDIO_MEDIA_ID_GENRES);
    
            ...
        }

    添加 uri 匹配对应关系。
    第二个参数 "*/audio/media" 中的 “*” 给 internalexternal 预留位置,用于指明访问的数据库位于 内置存储器 或是 外置存储器

    URI_MATCHER.match(uri);

    源码使用了 UriMatch 对传入的 uri 进行匹配。

    总结

    MediaProvider 本质上就是一个 Provider ,用过 ContentProvider 去理解应该不难。

    附:MediaStore Uri 与 数据库对应表(仅供参考)

    URI (content://media/external/audio/) Table \ View (external.db)
    media (specific) audio_meta
    media (all) & media/# audio
    media/#/genres & media/#/genres/# audio_genres
    media/#/playlists & media/#/playlists/# audio_playlists
    genres & genres/# audio_genres
    genres/#/members audio_genres_map_noid
    genres/all/members audio_genres_map_noid
    playlists & playlists/# audio_playlists
    playlists/#/members & playlists/#/members/# audio_playlists_map
    artists (specific) audio_meta
    artists (all) & artists/# artist_info
    artists/#/albums [多张表联合]
    albums (specific) audio_meta
    albums (all) & albums/# album_info
    albumart/# album_art

    P. S. MediaProvider.class 比较大,下载下来之后,放到 Android Studio 上可以方便查看代码。
    AS

    展开全文
  • 查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一定的对应关系,用错了版本就会出现连接不上数据库的异常。 这里给出mysql jdbc驱动版本与mysql数据库版本的对应关系,照着以下关系,选择相应的jdbc...

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致。查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一定的对应关系,用错了版本就会出现连接不上数据库的异常。

    这里给出mysql jdbc驱动版本与mysql数据库版本的对应关系,照着以下关系,选择相应的jdbc驱动和mysql数据版本即可。
    Connector/J8.0.12支持Mysql8.0.12这些版本。
    Connector/J 5.1 支持Mysql 4.1、Mysql 5.0、Mysql 5.1、Mysql 6.0 alpha这些版本。
    Connector/J 5.0 支持MySQL 4.1、MySQL 5.0 servers、distributed transaction (XA)。
    Connector/J 3.1 支持MySQL 4.1、MySQL 5.0 servers、MySQL 5.0 except distributed transaction (XA) support。
    Connector/J 3.0 支持MySQL 3.x or MySQL 4.1。

    spring boot数据库配置信息:https://blog.csdn.net/Simba_cheng/article/details/81008236

    展开全文
  • 数据库关系数据库关系运算

    千次阅读 多人点赞 2020-03-25 11:59:13
    我们学习关系运算的机理,对我们理解数据库查询操作非常重要 所以我们进行关系操作时很大程度上需要明白关系操作以及关系之间的逻辑 在我们进行数据库查询操作时,如何规范的使用数据库语言,如何进行选择时能够消除...

    关系运算的机理有什么用

    我们学习关系运算的机理,对我们理解数据库查询操作非常重要
    所以我们进行关系操作时很大程度上需要明白关系操作以及关系之间的逻辑
    在我们进行数据库查询操作时,如何规范的使用数据库语言,如何进行选择时能够消除我们不想要的结果,减少冗余。这些都需要充分理解关系运算

    各种关系运算

    在这里插入图片描述

    集合运算符

    1.并运算
    在这里插入图片描述

    2.差运算
    在这里插入图片描述
    3.交运算
    在这里插入图片描述
    4.笛卡儿积

    专门关系运算符

    数据库的专门关系运算有:选择、投影、连接、自然连接、除运算等
    1.选择运算
    选择就是对表在水平方向上,筛选出一定符合条件的元组,然后组成新的关系
    例:
    在这里插入图片描述
    2.投影运算
    投影就是对表在垂直方向上,对列进行筛选。
    例:

    3.连接
    连接就是根据给定的条件,从两个已知的关系R和S的笛卡尔集中,选取满足连接条件的若干元组,组成一个新的关系;
    具体又分为:
    1.条件连接:选取满足条件的元组组成新关系
    2.等值连接:选取满足等值条件的元组组成的关系
    3.自然连接:也是等值连接,只不过它是选取满足公共属性满足等值的元组,组成关系
    4.外连接

    举例:
    先给出两个关系R和S:

    在这里插入图片描述
    R和S的笛卡儿积表示为:
    在这里插入图片描述
    我们先进行条件连接
    选择R的C列小于S的E列的元组进行连接
    表示为:

    在这里插入图片描述
    反映到笛卡儿积上:
    在这里插入图片描述
    2.等值连接
    等值连接R的B列等于S的B列:
    在这里插入图片描述
    3.自然连接
    选取满足公共属性满足等值的元组,组成关系
    暗含的条件是R.B=S.B且R.C=S.C,因为R、S中公共的属性列是B、C

    在这里插入图片描述
    反映到笛卡儿积上表示如下:
    在这里插入图片描述
    4.外连接:外连接就是将不满足条件舍弃的元组也保留到新关系中其属性值置为null
    R和S的外连接:
    1.先将R和S进行自然连接
    2.把不满足R.B=S.B的元组也保存下来,其属性值置空
    结果为:
    在这里插入图片描述

    除运算:

    概念就不放了直接举例理解:
    在这里插入图片描述
    首先第一个(1),这个新生成的列表首先不能包含S的属性A3,然后这个新生成的表其所有属性值和S表组合都等在R中找到,满足这两个条件得到的结果就是上图
    第二个(2),首先生成新表不包含S属性A3的值c,f,然后新表的每个属性对应行的值和S对应的属性值组成的元组都能在R中找到,满足条件就是如图
    第三第四个同样。

    展开全文
  • oracle数据库服务器=数据库+数据库实例。 1.一个部分是Oracle数据库database。 Oracle数据库database,包括有数据文件、控制文件、重做日志文件,都是一些物理上的文件。 2.一个部分是数据库实例instance。 ...

    oracle数据库服务器=数据库+数据库实例。

            1.一个部分是Oracle数据库database。

                  Oracle数据库database,包括有数据文件、控制文件、重做日志文件,都是一些物理上的文件。

            2.一个部分是数据库实例instance。

                  数据库实例是一系列复杂的内存结构和操作系统进程,包括:

                          a.有数据库后台进程(PMON、SMON、DBWR、LGWR、CKPT等)

                          b.内存区域SGA(包括shared pool、db buffer cache、redo log buffer等)。

         

     

    数据库与实例之间是1-1或者1-n的关系

    在非并行的数据库系统中,每个Oracle数据库与一个实例相对应;

    在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。

    在任何情况下,每个实例都只可以对应一个数据库。

    展开全文
  • hibernate,java,数据库类型对应关系

    千次阅读 2016-07-20 22:41:32
    timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是...
  • 数据库中实体的对应关系

    千次阅读 2016-09-28 11:17:05
    一、 多表设计中的三种实体关系: (1)一对多(1:n):  一个部门可以对应多个员工,一个员工只能属于一个部门!  一个客户可以对应多个订单,一个订单只能属于一个客户! * 一对多关系建表原则: ...
  • 各种数据库对应的jar包

    千次阅读 2017-08-07 13:53:08
    1.1. 各种数据库对应的jar包具体如下:数据库类型对应的Jar文件Oracle 8iclasses12.zip 或 ojdbc14.jarSybasejconn2.jar 或 jconn3.jarMysqlmysql-connector-java-3.1.1-alpha-bin.jar 或mysql-connector-java-5.0.2...
  • 数据库通常分为层次式数据库、网络式数据库关系数据库三种。而不同的数据库是按不同的数据结构来联系和组织的。  1.数据结构模型  (1)数据结构  所谓数据结构是指数据的组织形式或数据之间的联系。...
  • 数据库 - 关系数据库标准语言SQL

    千次阅读 2015-05-05 09:57:12
    SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言SQL特点1.综合统一 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于...
  • 一、关系数据结构及形式化定义 1、关系 关系模型的数据结构非常简单,只包含单一的数据结构——关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。 1.1域 域是一组具有相同数据类型值的集合。 ...
  • 文章目录关系数据库关系操作基本关系操作关系数据库语言的分类关系模型的完整性实体完整性(Entity Integrity)参照完整性(Referential Integrity)用户定义完整性(User-defined Integrity)E-R图向关系模型的转换...
  • 数据库类型与java数据类型的对应关系1. 从 JDBC 类型映射到 Java 类型JDBC 类型Java 类型CHARStringVARCHARStringLONGVARCHARStringNUMERICjava.math.BigDecimalDECIMALjava.math....
  • mysql数据库类型 自增 AutoField int 布尔 BooleanField tinyint NullBooleanField tinyint 字符 CharField varchar TextField longtext ...
  • NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高 2、可扩展性 同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。 3、使用场景:日志、...
  • 有时候我们在javabean中定义的实体类名字与数据库不一样,此时mybatis就无法将数据库与实体类相对应,除了xml配置外我们还可以使用@results注解来加以注明。 在Results注解下可设置一个id方便其他sql语句使用 ,...
  • 数据库字段类型和java的对应关系

    千次阅读 2017-03-02 14:47:02
    由于 SQL 数据类型和 Java 数据类型是不同的,因此需要某种机制在使用 Java 类型的应用程序和使用 SQL 类型的数据库之间来读写数据。 为此,JDBC 提供了 getXXX 和 setXXX 方法集、方法 registerOutParameter...
  • 数据库关系代数详解

    千次阅读 多人点赞 2021-02-26 16:35:55
    数据库关系代数 1. 关系代数的运算 1.1 传统的关系运算 传统的关系运算起源于数学的集合论,有下面几种: 笛卡尔积运算 差运算 交运算 并运算 1.2 专门的关系运算 选择 投影 连接 除运算 1.2.1 关系运算中的基础...
  • 数据库实体间有三种对应关系:一对一,一对多,多对多。一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。 一对多关系示例:一个学生只属于一个班,但是一个学院有多名学生。 多对...
  • 数据库字段和java类型的对应关系

    千次阅读 2012-05-18 15:09:45
    下表说明用来当作从产生资源的模型的java.sql.Type值之间的关系,其对应的Java物件类型,以及在受支援的JDBC平台上每一个这些类型的实作(若有的话)。  表格也会指出标准Portal Content Publishing范本所支援的类型...
  • 在我们写代码的时候,避免不了和数据库打交道,那么就经常会遇到JAVA类型和数据库类型的映射关系。映射表如下:下面就举个例子来讲(JAVA插入MySql的datetime类型的简单的例子):看了映射表可知:我们可以以...
  • 关系数据库 关系数据库关系模型中的常用概念 优点 不足 非关系数据库关系数据库: 非关系数据库结构 优点 不足 分类 CAP 理论 关系型与非关系数据库的比较 最近的数据库排名 关系型...
  • jdbcType javaType mysql oracle CHAR String CHAR CHAR VARCHAR String VARCHAR VARCHAR LONGVARCHAR ...
  • 数据库关系代数中的关系运算

    千次阅读 2016-10-25 16:42:30
    除法运算的定义: 这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明除法运算的求解过程...第二步:被除关系R中与S中不相同的属性列是X,关系R在属性(X)上做取消重复值的投影为{X1,
  • 大家好,我是魔王哪吒,话不多说,今天带来的是一篇《考前复习必备MySQL数据库关系数据库管理系统)》文章,欢迎大家喜欢。前言MySQL是一个关系数据库管理系统,在web应用方面,M...
  • 数据库类型与JDBC TYPE 和Java类型对应关系 SQLDatatypes JDBC Typecodes Standard Java Types Java取值范围 NUMBER java.sql.Types.NUMERIC java.math....
  • mysql驱动与jdk版本还有着一定的关系,经现场实测及搜索资料,记录如下: 应用JDK版本1.5 测试环境MySQL版本5.7 驱动版本5.1.40.jar 正常 生产环境MySQL版本8.0 驱动版本5.1.40.jar 连接不上 生产环境MySQL...
  • 关系数据库与非关系数据库的区别

    万次阅读 2018-11-01 20:50:59
    当前主流的关系数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。 非关系数据库有 NoSql、Cloudant。 nosql和关系数据库比较? 优点: 1)成本:nosql数据库简单易部署,基本都是开源...
  • 常见的数据库模型分为两种,分别是关系数据库关系数据库关系数据库 关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单说,关系数据库是由多...
  • 似乎任何一个成熟的系统,都支持数据库。...大家知道,在setings应用中,用户可以设置来电铃声,通知铃声,闹铃等,那么,这些声音放在哪,对应数据库又是什么? 在Android中,使用sqlite进行数据库的存储和访问。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 571,051
精华内容 228,420
关键字:

数据库对应关系