精华内容
下载资源
问答
  • 多媒体数据库

    2011-11-06 15:42:00
    学编程时曾练习过的 数据多媒体库 与有志同仁共同提高
  • android 多媒体数据库,对数据库表,存储做一个分析。
    主要分为几节:

    1. Android的媒体文件内部是如何存储的?
    2. Andoid的媒体文件如何获取?
    3. 在使用媒体文件的一些小技巧。
    1. Android的多媒体如何存储的?
    Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal.db),一个是存储卡数据库(external-XXXX.db)。媒体文件的操作主要是围绕着这两个数据库来进行。这两个数据库的结构是完全一模一样的。
    我们先看一下这两个数据库包含了哪些表。
    album_art audio search
    album_info audio_genres searchhelpertitle
    albums audio_genres_map thumbnails
    android_metadata audio_meta video
    artist_info audio_playlists videothumbnails
    artists audio_playlists_map
    artists_albums_map images

    先从基本的分析:

    Images表:主要存储images信息。可以看一下这个表的结构:

    CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_name TEXT,mime_type TEXT,title
    TEXT,date_added INTEGER,date_modified INTEGER,description TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBL
    E,longitude DOUBLE,datetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,bucket_displa
    y_name TEXT);
    包含了一些基本信息,其中大家一看就明白了。
    Thumbnails表:这个表和images表是有直接关系的。主要存储图片的缩略图,Android为每一张保存进系统的图片文件都会自动生成一张缩略图文件。关于这一点还有一些特殊的技巧后面再讲。我们可以看一下这个表的结构:
    CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);
    每一张image对应一条thumbnail记录。
    Video表:主要存储视频信息了。和images表类似。表结构如下:
    CREATE TABLE video (_id INTEGER PRIMARY KEY,_data TEXT NOT NULL,_display_name TEXT,_size INTEGER,mime_type TEXT,date_added INTEGER,date_modified INTEGER,title TEXT,duration INTEGER,artist TEXT,album TEXT,resolution TEXT,description TEXT,isprivate INTEGER,tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER, bucket_id TEXT, bucket_display_name TEXT, bookmark INTEGER);
    Videothumbnails表:存储视频的缩略图信息。这个和thumbnails表类似。
    Audio表:音频信息比视频信息和图片信息要稍微复杂一些,主要是存储了一些专辑(album)、歌手(artists)信息,而专辑和歌手信息是单独的表格存储的,audio其实是一个视图,真正的音频数据信息存储在audio_meta表格中。我们可以看一下audio视图的定义:
    CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id LEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;
    Albums表:主要存储专辑信息。
    Artists表:主要存储歌手信息。不多赘述。
    其他的一些表格我们平时可能用的比较少,就不做描述了,有兴趣可以自行研究一下。
    2. Android的多媒体如何获取?

    Android提供了媒体获取与存储的相关API,主要包含在android.provider.MediaStorepackage中。

    MediaStore.Audio.AlbumColumns

    Columns representing an album

    MediaStore.Audio.ArtistColumns

    Columns representing an artist

    MediaStore.Audio.AudioColumns

    Columns for audio file that show up in multiple tables.

    MediaStore.Audio.GenresColumns

    Columns representing an audio genre

    MediaStore.Audio.PlaylistsColumns

    Columns representing a playlist

    MediaStore.Files.FileColumns

    Fields for master table for all media files.

    MediaStore.Images.ImageColumns

    MediaStore.MediaColumns

    Common fields for most MediaProvider tables

    MediaStore.Video.VideoColumns

    MediaStore

    The Media provider contains meta data for all available media on both internal and external storage devices.

    MediaStore.Audio

    Container for all audio content.

    MediaStore.Audio.Albums

    Contains artists for audio files

    MediaStore.Audio.Artists

    Contains artists for audio files

    MediaStore.Audio.Artists.Albums

    Sub-directory of each artist containing all albums on which a song by the artist appears.

    MediaStore.Audio.Genres

    Contains all genres for audio files

    MediaStore.Audio.Genres.Members

    Sub-directory of each genre containing all members.

    MediaStore.Audio.Media

    MediaStore.Audio.Playlists

    Contains playlists for audio files

    MediaStore.Audio.Playlists.Members

    Sub-directory of each playlist containing all members.

    MediaStore.Files

    Media provider table containing an index of all files in the media storage, including non-media files.

    MediaStore.Images

    Contains meta data for all available images.

    MediaStore.Images.Media

    MediaStore.Images.Thumbnails

    This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail

    MediaStore.Video

    MediaStore.Video.Media

    MediaStore.Video.Thumbnails

    This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail

    简单的观察一下,发现这些类也就是对数据库中的一些表的封装,弄懂了底层的存储结构,对于了解这些类的作用就很容易了。

    Android系统中的每一种媒体文件有两种地址描述方式。

    第一种模式,大家知道,在Android中,Content Provider是用来存储和获取公共数据的统一接口,Content Provider为每一类资源分配了URI地址,比如图片的地址就包括

    MediaStore.Images.Media.INTERNAL_CONTENT_URI和MediaStore.Images.Media.EXTERNAL_CONTENT_URI两个基础地址,其值分别是

    content://media/internal/images/media和content://media/external/images/media,对应内部库和外部库地址。每一张图片的地址基本上是上面的基础URL地址下加上图片的

    内部ID。打个比方一张存储卡上的图片ID为2,其对应的Uri地址就是content://media/external/images/media/2.知道了这个地址,基本上就可以操作这张图片的所有信息了。

    另外一种描述文件地址标识就是传统的文件路径模式了,比如一张存储卡上的图片地址可能描述为:/mnt/sdcard/images/1.jpg。其实这个路径存储在images表格中的data字

    段中,有了这点关联,我们可以在这两种模式下进行任意切换。

    前一种模式下,主要通过MediaStore.Images.Media、MediaStore.Audio.Media、MediaStore.Video.Media三个库中的query方法来查询或者获取特定条件的媒体了。

    基本用法1:从一个Content Uri地址中生成Bitmap

    可以采用android.provider.MediaStore.Images.Media.getBitmap(ContentResolver cr, Uri url)方法,其中ContentResolver是应用与资源之间的衔接人,它的示例通常可以通过

    在Activity中调用的getContentResolver()方法中获取。Uri地址就是上面描述的content://media/external/images/media/2类似地址,也就是Content Provider定义的地址形式。

    基本用法2:从一个传统地址中生成Bitmap

    有时候我们只知道一张图片的路径,并不知道图片的内部地址,想去获取该图片,可以采用android.graphics.BitmapFactory中的decodeXXX方法来搞定,比如decodeFile方法

    就是从文件路径中读取图片,原图片可以支持jpg,png,gif,bmp等各种格式。decodeByteArray就是从字节流中解码了。最后都是转换成Bitmap格式。

    基本用法3:获取一张图片的缩略图

    有时候我们需要显示图片的缩略图,可以采用android.provider.MediaStore.Images.Thumbnails的getThumbnail方法。另外其实也可以采用bitmap的compress的方法对图片

    进行一些压缩处理。


    转载来自:http://www.360doc.com/content/15/1010/09/22991113_504585902.shtml

    展开全文
  • android 多媒体数据库

    千次阅读 2017-05-06 10:34:37
    android多媒体数据库表分析,深入学习android数据库。
    
    

    摘要: Android MediaProvider 使用 SQLite 数据库存储图片、视频、音频等多媒体文件的信息,供视频播放器、音乐播放器、图库使用。本文详细分析了 Android MediaProvider 多媒体数据库(以 SDK 2.3.3 为例)的模式(schema),并简要叙述与系统媒体扫描服务 MediaScanner 的交互。

    1. 如何提取数据库
    以 root 权限进入 adb shell,使用 sqlite3 打开位于手机上 /data/data/com.android.providers.media/databases 上的一个数据库。以 external 开头的数据库存储的是 SD 卡媒体信息,一张卡对应一个,所以如果手机使用过多张卡会有多个数据库。以 internal 开头的数据库存储手机内部存储器的媒体信息。因为一般用户无法访问手机内部存储器,而且这两个数据库结构是大体上是相同的,所以只需要关注 external 数据库即可。

    Note: 数据库都是以类似 external-ffffffff.db 的形式命名的, 后面的 8 个 16 进制字符是该 SD 卡 FAT 分区的 Volume ID。该 ID 是分区时决定的,只有重新分区或者手动改变才会更改,可以防止插入不同 SD 卡时数据库冲突。要简单了解 FAT 文件系统请看 Understanding FAT Filesystems

    接着在 sqlite3 执行命令 .schema 即可导出创建数据库的 SQL 语句,也就是数据库模式,具体如下:

    1 CREATE TABLE album_art (album_id INTEGER PRIMARY KEY,_data TEXT);
    2 CREATE TABLE albums (album_id INTEGER PRIMARY KEY,album_key TEXT NOT NULL UNIQUE,album TEXT NOT NULL);
    3 CREATE TABLE android_metadata (locale TEXT);
    4 CREATE TABLE artists (artist_id INTEGER PRIMARY KEY,artist_key TEXT NOT NULL UNIQUE,artist TEXT NOT NULL);
    5 CREATE TABLE audio_genres (_id INTEGER PRIMARY KEY,name TEXT NOT NULL);
    6 CREATE TABLE audio_genres_map (_id INTEGER PRIMARY KEY,audio_id INTEGER NOT NULL,genre_id INTEGER NOT NULL);
    7 CREATE TABLE audio_meta (_id INTEGER PRIMARY KEY,_data TEXT UNIQUE NOT NULL,_display_name TEXT,_size INTEGER,mime_type TEXT,date_added INTEGER,date_modified INTEGER,title TEXT NOT NULL,title_key TEXT NOT NULL,duration INTEGER,artist_id INTEGER,composer TEXT,album_id INTEGER,track INTEGER,year INTEGER CHECK(year!=0),is_ringtone INTEGER,is_music INTEGER,is_alarm INTEGER,is_notification INTEGER, is_podcast INTEGER, bookmark INTEGER);
    8 CREATE TABLE audio_playlists (_id INTEGER PRIMARY KEY,_data TEXT,name TEXT NOT NULL,date_added INTEGER,date_modified INTEGER);
    9 CREATE TABLE audio_playlists_map (_id INTEGER PRIMARY KEY,audio_id INTEGER NOT NULL,playlist_id INTEGER NOT NULL,play_order INTEGER NOT NULL);
    10 CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_name TEXT,mime_type TEXT,title TEXT,date_added INTEGER,date_modified INTEGER,description TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,bucket_display_name TEXT);
    11 CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);
    12 CREATE TABLE video (_id INTEGER PRIMARY KEY,_data TEXT NOT NULL,_display_name TEXT,_size INTEGER,mime_type TEXT,date_added INTEGER,date_modified INTEGER,title TEXT,duration INTEGER,artist TEXT,album TEXT,resolution TEXT,description TEXT,isprivate INTEGER,tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER, bucket_id TEXT, bucket_display_name TEXT, bookmark INTEGER);
    13 CREATE TABLE videothumbnails (_id INTEGER PRIMARY KEY,_data TEXT,video_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);
    14 
    15 CREATE VIEW album_info AS SELECT audio.album_id AS _id, album, album_key, MIN(year) AS minyear, MAX(year) AS maxyear, artist, artist_id, artist_key, count(*) AS numsongs,album_art._data AS album_art FROM audio LEFT OUTER JOIN album_art ON audio.album_id=album_art.album_id WHERE is_music=1 GROUP BY audio.album_id;
    16 CREATE VIEW artist_info AS SELECT artist_id AS _id, artist, artist_key, COUNT(DISTINCT album_key) AS number_of_albums, COUNT(*) AS number_of_tracks FROM audio WHERE is_music=1 GROUP BY artist_key;
    17 CREATE VIEW artists_albums_map AS SELECT DISTINCT artist_id, album_id FROM audio_meta;
    18 CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id LEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;
    19 CREATE VIEW search AS SELECT _id,'artist' AS mime_type,artist,NULL AS album,NULL AS title,artist AS text1,NULL AS text2,number_of_albums AS data1,number_of_tracks AS data2,artist_key AS match,'content://media/external/audio/artists/'||_id AS suggest_intent_data,1 AS grouporder FROM artist_info WHERE (artist!='<unknown>') UNION ALL SELECT _id,'album' AS mime_type,artist,album,NULL AS title,album AS text1,artist AS text2,NULL AS data1,NULL AS data2,artist_key||' '||album_key AS match,'content://media/external/audio/albums/'||_id AS suggest_intent_data,2 AS grouporder FROM album_info WHERE (album!='<unknown>') UNION ALL SELECT searchhelpertitle._id AS _id,mime_type,artist,album,title,title AS text1,artist AS text2,NULL AS data1,NULL AS data2,artist_key||' '||album_key||' '||title_key AS match,'content://media/external/audio/media/'||searchhelpertitle._id AS suggest_intent_data,3 AS grouporder FROM searchhelpertitle WHERE (title != '');
    20 CREATE VIEW searchhelpertitle AS SELECT * FROM audio ORDER BY title_key;
    21 
    22 CREATE INDEX album_id_idx on audio_meta(album_id);
    23 CREATE INDEX album_idx on albums(album);
    24 CREATE INDEX albumkey_index on albums(album_key);
    25 CREATE INDEX artist_id_idx on audio_meta(artist_id);
    26 CREATE INDEX artist_idx on artists(artist);
    27 CREATE INDEX artistkey_index on artists(artist_key);
    28 CREATE INDEX image_bucket_index ON images(bucket_id, datetaken);
    29 CREATE INDEX image_id_index on thumbnails(image_id);
    30 CREATE INDEX sort_index on images(datetaken ASC, _id ASC);
    31 CREATE INDEX title_idx on audio_meta(title);
    32 CREATE INDEX titlekey_index on audio_meta(title_key);
    33 CREATE INDEX video_bucket_index ON video(bucket_id, datetaken);
    34 CREATE INDEX video_id_index on videothumbnails(video_id);
    35 
    36 CREATE TRIGGER albumart_cleanup1 DELETE ON albums BEGIN DELETE FROM album_art WHERE album_id = old.album_id;END;
    37 CREATE TRIGGER albumart_cleanup2 DELETE ON album_art BEGIN SELECT _DELETE_FILE(old._data);END;
    38 CREATE TRIGGER audio_delete INSTEAD OF DELETE ON audio BEGIN DELETE from audio_meta where _id=old._id;DELETE from audio_playlists_map where audio_id=old._id;DELETE from audio_genres_map where audio_id=old._id;END;
    39 CREATE TRIGGER audio_genres_cleanup DELETE ON audio_genres BEGIN DELETE FROM audio_genres_map WHERE genre_id = old._id;END;
    40 CREATE TRIGGER audio_meta_cleanup DELETE ON audio_meta BEGIN DELETE FROM audio_genres_map WHERE audio_id = old._id;DELETE FROM audio_playlists_map WHERE audio_id = old._id;END;
    41 CREATE TRIGGER audio_playlists_cleanup DELETE ON audio_playlists BEGIN DELETE FROM audio_playlists_map WHERE playlist_id = old._id;SELECT _DELETE_FILE(old._data);END;
    42 CREATE TRIGGER images_cleanup DELETE ON images BEGIN DELETE FROM thumbnails WHERE image_id = old._id;SELECT _DELETE_FILE(old._data);END;
    43 CREATE TRIGGER thumbnails_cleanup DELETE ON thumbnails BEGIN SELECT _DELETE_FILE(old._data);END;
    44 CREATE TRIGGER video_cleanup DELETE ON video BEGIN SELECT _DELETE_FILE(old._data);END;
    45 CREATE TRIGGER videothumbnails_cleanup DELETE ON videothumbnails BEGIN SELECT _DELETE_FILE(old._data);END;

    Note: 如果手机没有 sqlite3 程序,可以搜索编译过的源代码的 out 目录找到可执行文件,大约 90kb,然后 adb push 到手机的 /system/bin/ 目录。安装 sqlite3、查询数据库均需要 adb root 权限。 Android 的多媒体数据库主要由表、视图、索引以及触发器组成。


    接着还需要把数据库转换成图,手工转换的话就是根据 SQL 语句自行画图;推荐懒人使用自动转换,先使用 adb pull 把数据库导出,再使用 Power Designer 或者 Visio 的逆向工程(Reverse Engineer)功能生成物理数据模型(Physical Data Model)。注意要连接 sqlite 数据库文件的话需要先安装 sqlite 的 ODBC 驱动,教程在这里:SQLite ODBC Driver

    2. 数据库模式分析

    图片数据库
    图片数据库由两个表组成,分别是 images 和 thumbnails,物理数据模型如下所示(Power Designer 逆向工程生成)


    Note: 如何数据库物理模型图:<pk> 表示此为主键。其余的表名、字段名、数据类型应该都能看明白。


    Note: SQLite 从 3.6.19 版才开始支持外键约束,Android 2.3.3 使用的是 3.7.x,但并没有使用此特性,而是通过操作数据库的程序(如 MediaScanner)以及触发器来维护数据库的一致性。这里可以了解 SQLite 的外键支持情况

    数据表字段解析如下:

    images:图片信息

    字段 解析
    _id 主键。图片 id,从 1 开始自增
    _data 图片绝对路径
    _size 文件大小,单位为 byte
    _display_name 文件名
    mime_type 类似于 image/jpeg 的 MIME 类型
    title 不带扩展名的文件名
    date_added 添加到数据库的时间,单位秒
    date_modified 文件最后修改时间,单位秒
    description  
    picasa_id 用于 picasa 网络相册
    isprivate  
    latitude 纬度,需要照片有 GPS 信息
    longitude 经度,需要照片有 GPS 信息
    datetaken 取自 EXIF 照片拍摄时间,若为空则等于文件修改时间,单位毫秒
    orientation 取自 EXIF 旋转角度,在图库旋转图片也会改变此值
    mini_thumb_magic 取小缩略图时生成的一个随机数,见 MediaThumbRequest
    bucket_id 等于 path.toLowerCase.hashCode(),见 MediaProvider.computeBucketValues()
    bucket_display_name 直接包含图片的文件夹就是该图片的 bucket,就是文件夹名
    thumbnails:缩略图
    字段 解析
    _id 主键。缩略图 id,从 1 开始自增
    _data 图片绝对路径
    image_id 缩略图所对应图片的 id,依赖于 images 表 _id 字段,可建立外键
    kind 缩略图类型,1 是大缩略图,2 基本不用,3 是微型缩略图但其信息不保存在数据库
    width 缩略图宽度
    height 缩略图高度

    视频数据库


    数据表字段解析如下:

    video:视频信息
    字段 解析
    _id 主键。视频 id
    _data 视频绝对路径
    _display_name 文件名
    _size 文件大小,单位为 byte
    mime_type 类似于 video/avi 的 MIME 类型
    date_added 添加到数据库的时间,单位秒
    date_modified 文件最后修改时间,单位秒
    title 不带扩展名的文件名
    duration 视频时长,单位毫秒
    artist 艺术家
    album 专辑名,一般为文件夹名
    resolution  
    description  
    isprivate  
    tags  
    category  
    language  
    mini_thumb_data  
    latitude  
    longitude  
    datetaken  
    mini_thumb_magic 取小缩略图时生成的一个随机数,见 MediaThumbRequest
    bucket_id 等于 path.toLowerCase.hashCode(),见 MediaProvider.computeBucketValues()
    bucket_display_name 直接包含视频的文件夹就是该图片的 bucket,就是文件夹名
    bookmark  
    videothumbnails:视频缩略图
    字段 解析
    _id 主键。缩略图 id
    _data 缩略图绝对路径
    video_id 缩略图所对应视频的 id,依赖于 video 表 _id 字段
    kind 缩略图类型,1 是大图,视频只能取类型 1
    width 缩略图宽度
    height 缩略图高度

    音频数据库


    音频数据库是最复杂的,由 10 个表组成。物理数据模型如下所示:

    album_art:专辑封面
    字段 解析
    album_id 主键。专辑 id
    _data 专辑封面缓存的路径
    albums:专辑信息
    字段 解析
    album_id 主键。专辑 id
    album_key 全大写字母,用于字母索引
    album 专辑名
    android_metadata:当前字符编码
    字段 解析
    locale 默认字符编码,例如 zh_CN
    artists:艺术家
    字段 解析
    artist_id 主键。艺术家 id
    artist_key 全大写字母,用于字母索引
    artist 艺术家
    audio_genres:流派
    字段 解析
    _id 主键。流派 id
    name 流派名称
    audio_genres_map:音频流派映射
    字段 解析
    _id 主键。映射 id
    audio_id 音频 id
    genre_id 流派 id

    Note: 为何要建立映射表:为了消除数据冗余。假如有大量音频属于同一流派,如果没有映射表则需要每个音频都需要记录同样的流派数据,有了映射表之后则只有一条记录就够了。这符合数据库设计的第三范式(the 3rd normal form)

    audio_meta:音频信息
    字段 解析
    _id 主键。音频 id
    _data 文件绝对路径
    _display_name 文件名
    _size 文件大小,单位 byte
    mime_type 类似于 audio/mpeg 的 MIME 类型
    date_added 添加到数据库的时间,单位秒
    date_modified 文件最后修改时间,单位秒
    title 来自 ID3 信息的标题,无则为不带扩展名的文件名
    title_key 全大写字母的标题
    duration 时长
    artist_id 艺术家 id
    composer 来自 ID3 信息,作曲家
    album_id 专辑 id
    track 来自 ID3 信息,音轨
    year 来自 ID3 信息,年代
    is_ringtone 是否铃声,0 或 1
    is_music 是否音乐,1 才会在音乐播放器显示
    is_alarm 是否闹钟铃声
    is_notification 是否通知铃声
    is_podcast 是否 podcast
    bookmark  
    audio_playlists:播放列表
    字段 解析
    _id 主键。播放列表 id
    _data  
    name 播放列表名
    date_added  
    date_modified  
    audio_playlists_map:音频播放列表映射
    字段 解析
    _id 主键。映射 id
    audio_id 音频 id
    playlist_id 播放列表 id
    play_order 播放顺序

    索引


    在 Android 数据库当中基本上使用自增 id 值作为主键,并建立了索引。索引可以加快数据查找速度,但由于需要维护索引所以插入/删除等写入操作速度会变慢。索引如下:

    1 CREATE INDEX album_id_idx on audio_meta(album_id);
    2 CREATE INDEX album_idx on albums(album);
    3 CREATE INDEX albumkey_index on albums(album_key);
    4 CREATE INDEX artist_id_idx on audio_meta(artist_id);
    5 CREATE INDEX artist_idx on artists(artist);
    6 CREATE INDEX artistkey_index on artists(artist_key);
    7 CREATE INDEX image_bucket_index ON images(bucket_id, datetaken);
    8 CREATE INDEX image_id_index on thumbnails(image_id);
    9 CREATE INDEX sort_index on images(datetaken ASC, _id ASC);
    10 CREATE INDEX title_idx on audio_meta(title);
    11 CREATE INDEX titlekey_index on audio_meta(title_key);
    12 CREATE INDEX video_bucket_index ON video(bucket_id, datetaken);
    13 CREATE INDEX video_id_index on videothumbnails(video_id);

    由于比较简单就不解释了,要深入了解索引可以参考这个关于 SQL Server 的分析MySQL索引背后的数据结构及算法原理,原理应该是差不多的。

    视图

    视图类似于表,但并非独立存在,是从其他表里面查询数据得到的。使用视图可以加快数据库查询速度,不用每次都执行复杂的 SQL 语句查询。图如下所示:


    Note: 如何看视图:图下面的部分是数据来源的表,中间是从表中选取的字段,但类似于 COUNT 等 SQL 查询操作无法在图上体现,最好还是看实际 SQL 语句。

    Note: SQLite 当中视图都是只读的,也就是说不能对视图进行插入、更新、删除等操作。但是可以在视图建立 INSTEAD OF 触发器来达到同样的目的,多媒体数据库当中的

     audio_delete 触发器就是如此。

    触发器


    触发器是为了维护数据库删除操作而建立的,因为所删除的表可能与另外的表有关系,需要同时删除另外一个表的字段。可以看以下一个例子:


    1 CREATE TRIGGER audio_meta_cleanup
    2 DELETE ON audio_meta
    3 BEGIN
    4 DELETE FROM audio_genres_map WHERE audio_id = old._id;
    5 DELETE FROM audio_playlists_map WHERE audio_id = old._id;
    6 END;

    这是关于 audio_meta 表的触发器,意思是当删除此表上的记录时,同时删除 audio_genres_map 表上 audio_id 与此表 id 相同的记录,删除 audio_playlists_map 表上 audio_id 与此表 id 相同的记录。这样当删除 audio_meta 表的记录时,另外两个表的相应记录也会自动删除,不会由于漏删除而残留多余数据。

    3. 如何维护数据库


    插入


    插入、更新主要由 MediaScanner 进行,当删除/移动媒体文件时 MediaScanner 会扫描磁盘并更新数据库。数据插入主要在 endFile() 方法中进行,例如插入音频记录时相关的表都会插入相应的记录。而图片、视频缩略图,专辑封面这几个则是第一次取图片的时候才会生成缩略图保存到磁盘,并把记录插入到数据库中。

    删除


    删除操作主要由触发器维护。例如当一个应用删除图片时,一般只会删除图片数据库,所以必须要有触发器同时删除缩略图数据库。

    删除操作主要由触发器维护。例如当一个应用删除图片时,一般只会删除图片数据库,所以必须要有触发器同时删除缩略图数据库。


    注:转发来自http://www.360doc.com/content/12/0814/19/7724936_230182794.shtml


    展开全文
  • 给出了多媒体数据库的元数据结构,对元数据的生成、基本媒体元数据(文本元数据、音频元数据、图像元数据和视频元数据)的存取方法进行了论述。...从媒体的内容及信息特征入手,抽象出元数据的存储与检索方法。
  • 多媒体数据库实验7

    2013-06-27 00:05:31
    这是云南大学软件学院多媒体数据库的实验报告。
  • 多媒体数据库实验3

    2013-06-27 00:00:04
    这是云南大学软件学院多媒体数据库的实验报告。
  • 下面将作者开发航材多媒体数据库管理系统的点滴经验做一介绍。 1 航材多媒体信息管理系统的组成和开发 l.1 航材多媒体信息管理系统的组成 航材仓库担负着航材的筹措、储存、管理、发付等任务。通常仓库中储存...
  • 多媒体数据库系统

    千次阅读 2018-04-25 09:19:07
    一般认为,数据模型化是数据库技术的基础和核心。广义地理解,数据模型化包括了概念模型、逻辑模型和物理模型的建立。其中概念模型是数据库设计者...多媒体数据库依托的是多媒体数据模型,首先需要把各种媒体所建立...

    一般认为,数据模型化是数据库技术的基础和核心。广义地理解,数据模型化包括了概念模型、逻辑模型和物理模型的建立。其中概念模型是数据库设计者对现实世界的抽象,逻辑 模型是对概念模型的逻辑表示,而物理模型是对逻辑模型的计算机表示。要把复杂的现实世界正确地描述出来,并将其数据及关系在数据库中进行存储和管理,关键的一步是要把现实世界抽象为概念模型。多媒体数据库依托的是多媒体数据模型,首先需要把各种媒体所建立的概念模型结合为一个有机地统一整体,使概念模型一体化,以形成一个“多媒体概念模型”,再以某种符号系统加以表示,形成多媒体数据模型的基础。

    1)多媒体数据模型具有的特性

    x①能支持媒体的独立性。这是因为多媒体数据库的目标应能实现诸如媒体的混合、媒体的扩充、媒体的互换,即应能使用户最大限度地可忽略各媒体间差别,而实现对复杂数据对象的管理和使用。

    ②要支持数据模型的三个基本要素:数据的结构性质,能描述实体及实体间的联系;具有与数据库相关的语义完整性限制;体现数据的操作特性,即要通过对各种媒体的符号化、抽象化,用户可以对各种媒体数据进行统一的处理和一致性管理。对不同内部表示的数据用同样的数据库语言进行操作,并提供能用于多媒体数据库语言接口。

    深圳IT外包   http://www.lankuai.info

    2)实现多媒体数据模型的方法

    ①基于关系数据模型的方法,即在关系数据模型中引入抽象数据类型,并对数据类型定义所必要的数据表示形式及其操作加以扩充。

    ②基于语义数据模型的方法,语义数据模型能提供更具自然的处理现实世界的数据及其联系能力,并在实体类型的表示及其联系上具有特点。当然还有其他的方法,如基于对象的数据建模方法等。目前对多媒体数据模型的研究还还很不充分,仍然缺乏完整的、具有普遍意义的理论。

    展开全文
  • 新华社多媒体数据库系统通过TRS Gateway(关系数据库网关)将原有各个部门系统中的信息采集到TRS Database Server(全文数据库服务器)中进行统一分类存储。对于互联网上有价值的新闻信息,则通过TRS InfoRadar(网络...
  • 主要分为几节: 1. Android的媒体文件内部是如何存储的?...Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal.

    主要分为几节:
    1. Android的媒体文件内部是如何存储的?
    2. Andoid的媒体文件如何获取?
    3. 在使用媒体文件的一些小技巧。
    4. Android的多媒体如何存储的?
    Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal.db),一个是存储卡数据库(external-XXXX.db)。媒体文件的操作主要是围绕着这两个数据库来进行。这两个数据库的结构是完全一模一样的。
    我们先看一下这两个数据库包含了哪些表。
    album_art audio search
    album_info audio_genres searchhelpertitle
    albums audio_genres_map thumbnails
    android_metadata audio_meta video
    artist_info audio_playlists videothumbnails
    artists audio_playlists_map
    artists_albums_map images
    先从基本的分析:
    Images表:主要存储images信息。可以看一下这个表的结构:
    CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_name TEXT,mime_type TEXT,title
    TEXT,date_added INTEGER,date_modified INTEGER,description TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBL
    E,longitude DOUBLE,datetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,bucket_displa
    y_name TEXT);
    包含了一些基本信息,其中大家一看就明白了。
    Thumbnails表:这个表和images表是有直接关系的。主要存储图片的缩略图,Android为每一张保存进系统的图片文件都会自动生成一张缩略图文件。关于这一点还有一些特殊的技巧后面再讲。我们可以看一下这个表的结构:
    CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);
    每一张image对应一条thumbnail记录。
    Video表:主要存储视频信息了。和images表类似。表结构如下:
    CREATE TABLE video (_id INTEGER PRIMARY KEY,_data TEXT NOT NULL,_display_name TEXT,_size INTEGER,mime_type TEXT,date_added INTEGER,date_modified INTEGER,title TEXT,duration INTEGER,artist TEXT,album TEXT,resolution TEXT,description TEXT,isprivate INTEGER,tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER, bucket_id TEXT, bucket_display_name TEXT, bookmark INTEGER);
    Videothumbnails表:存储视频的缩略图信息。这个和thumbnails表类似。
    Audio表:音频信息比视频信息和图片信息要稍微复杂一些,主要是存储了一些专辑(album)、歌手(artists)信息,而专辑和歌手信息是单独的表格存储的,audio其实是一个视图,真正的音频数据信息存储在audio_meta表格中。我们可以看一下audio视图的定义:
    CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id LEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;
    Albums表:主要存储专辑信息。
    Artists表:主要存储歌手信息。不多赘述。
    其他的一些表格我们平时可能用的比较少,就不做描述了,有兴趣可以自行研究一下。
    2. Android的多媒体如何获取?
    Android提供了媒体获取与存储的相关API,主要包含在android.provider.MediaStorepackage中。
    MediaStore.Audio.AlbumColumns
    Columns representing an album
    MediaStore.Audio.ArtistColumns
    Columns representing an artist
    MediaStore.Audio.AudioColumns
    Columns for audio file that show up in multiple tables.
    MediaStore.Audio.GenresColumns
    Columns representing an audio genre
    MediaStore.Audio.PlaylistsColumns
    Columns representing a playlist
    MediaStore.Files.FileColumns
    Fields for master table for all media files.
    MediaStore.Images.ImageColumns
    MediaStore.MediaColumns
    Common fields for most MediaProvider tables
    MediaStore.Video.VideoColumns
    MediaStore
    The Media provider contains meta data for all available media on both internal and external storage devices.
    MediaStore.Audio
    Container for all audio content.
    MediaStore.Audio.Albums
    Contains artists for audio files
    MediaStore.Audio.Artists
    Contains artists for audio files
    MediaStore.Audio.Artists.Albums
    Sub-directory of each artist containing all albums on which a song by the artist appears.
    MediaStore.Audio.Genres
    Contains all genres for audio files
    MediaStore.Audio.Genres.Members
    Sub-directory of each genre containing all members.
    MediaStore.Audio.Media
    MediaStore.Audio.Playlists
    Contains playlists for audio files
    MediaStore.Audio.Playlists.Members
    Sub-directory of each playlist containing all members.
    MediaStore.Files
    Media provider table containing an index of all files in the media storage, including non-media files.
    MediaStore.Images
    Contains meta data for all available images.
    MediaStore.Images.Media
    MediaStore.Images.Thumbnails
    This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail
    MediaStore.Video
    MediaStore.Video.Media
    MediaStore.Video.Thumbnails
    This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail
    简单的观察一下,发现这些类也就是对数据库中的一些表的封装,弄懂了底层的存储结构,对于了解这些类的作用就很容易了。
    Android系统中的每一种媒体文件有两种地址描述方式。
    第一种模式,大家知道,在Android中,Content Provider是用来存储和获取公共数据的统一接口,Content Provider为每一类资源分配了URI地址,比如图片的地址就包括MediaStore.Images.Media.INTERNAL_CONTENT_URI和MediaStore.Images.Media.EXTERNAL_CONTENT_URI两个基础地址,其值分别是content://media/internal/images/media和content://media/external/images/media,对应内部库和外部库地址。每一张图片的地址基本上是上面的基础URL地址下加上图片的内部ID。打个比方一张存储卡上的图片ID为2,其对应的Uri地址就是content://media/external/images/media/2.知道了这个地址,基本上就可以操作这张图片的所有信息了。
    另外一种描述文件地址标识就是传统的文件路径模式了,比如一张存储卡上的图片地址可能描述为:/mnt/sdcard/images/1.jpg。其实这个路径存储在images表格中的data字段中,有了这点关联,我们可以在这两种模式下进行任意切换。
    前一种模式下,主要通过MediaStore.Images.Media、MediaStore.Audio.Media、MediaStore.Video.Media三个库中的query方法来查询或者获取特定条件的媒体了。
    基本用法1:从一个Content Uri地址中生成Bitmap
    可以采用android.provider.MediaStore.Images.Media.getBitmap(ContentResolvercr,Uriurl)方法,其中ContentResolver是应用与资源之间的衔接人,它的示例通常可以通过在Activity中调用的getContentResolver()方法中获取。Uri地址就是上面描述的content://media/external/images/media/2类似地址,也就是Content Provider定义的地址形式。
    基本用法2:从一个传统地址中生成Bitmap
    有时候我们只知道一张图片的路径,并不知道图片的内部地址,想去获取该图片,可以采用android.graphics.BitmapFactory中的decodeXXX方法来搞定,比如decodeFile方法就是从文件路径中读取图片,原图片可以支持jpg,png,gif,bmp等各种格式。decodeByteArray就是从字节流中解码了。最后都是转换成Bitmap格式。
    基本用法3:获取一张图片的缩略图
    有时候我们需要显示图片的缩略图,可以采用android.provider.MediaStore.Images.Thumbnails的getThumbnail方法。另外其实也可以采用bitmap的compress的方法对图片进行一些压缩处理。

    展开全文
  • 多媒体数据库管理系统与传统的数据库系统一样,要提供对数据的管理、查询和事务处理等功能。除此之外,对于多媒体数据库管理系统必须要求它有独立于媒体的变化;由于其具有面向对象的特征,而往往需要根据不同的对象而 ...
  • Android多媒体相关的数据都存放在/data/data/com.android.providers.media/文件夹里的external.db和internal.db数据库里,二者的区别主要是前者是针对放在SDCard外部存储多媒体,后者主要针对放在手机本地存储里的...
  • VB源码 显示存储多媒体操作数据库,图片等
  • 与普通计算机不同,多媒体计算机强调图、文文、、声声、、像等多种媒体信息的处理能力像等多种媒体信息的处理能力,,其对输入、输出设备的要求比普通计算机更高更高。本章将对多媒体计算机的硬件组成本章将对多媒体...
  • 系统多媒体数据库

    2013-03-22 09:25:59
    1:MediaStore.Audio.Media对应的数据库文件在/data/data/com.android.Media/lib/internal.db 或者/data/data/com.android.Media/lib/external-ffffffff.db(SD卡对应路径) ...其中Images表:主要存储images信息 Thum
  • 1.多媒体数据库里的数据类型 MediaStore.Audio//音频文件信息 MediaStore.Vedio//视频文件信息 MediaStore.Image//图片文件信息 MediaStore.Downloads//已下载文件信息 MediaStore.Files;//所有文件类型信息 2.获取...
  • Android MediaProvider 使用 SQLite 数据库存储图片、视频、音频等多媒体文件的信息,供视频播放器、音乐播放器、图库使用。Media数据库分为internal 和external ,对应的是内部存储和外部存储数据库,两个数据库...
  • Android多媒体数据库详解

    千次阅读 2013-06-19 16:46:55
    主要分为几节: 1. Android的媒体文件内部是如何存储的?...Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal
  • 本程序实现了对图像的存储 和每个像素点颜色提取 以及对图像存储字段的检索 还有就是一个图像查看器 类似qq照片查看器那样
  • 1 试述数据数据库数据库系统数据库管理系统的概念 答 ( l 数据 Data ) 描述事物的符号记录称为数据数据的种类有数字文字图形图像声音正文等数据与其语义是不可分的解析在现代计算机系统中数据的概念是广义的早期的...
  • 两方面结合,多媒体数据库由此应运而生。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。 但是我们不能不遗憾的看到,现有数据库对一些多媒体数据所特有的操
  • LinkedIn近日开源了多媒体对象存储数据库Ambry(GitHub). LinkedIn过去使用的是一种闭源技术,非常复杂,而且也难以随着用户数和数据量的增长而扩展。LinkedIn工程总监Sriram Subramanian在博客中指出: 我们开始...
  • LinkedIn近日开源了多媒体对象存储数据库Ambry(GitHub). 我们开始尝试在市场中寻找更好的替代方案,包括各种分布式文件系统、存储一体机、云服务和内部部署方案都考察过,通过权衡我们的设计目标和得失后发现,...
  • 多媒体数据库系统的主要研究课题

    千次阅读 2006-03-03 09:56:00
    近年来,随着技术的发展,形形色色的数字化手段、设备层出不穷,媒体的数字化技术有了很大的发展。...各种独立媒体的数据库技术(如文本库、图形库、图像库等)的发展和研究为多媒体数据库系统的研究和开发提供了基

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,488
精华内容 13,795
关键字:

多媒体数据库存储的信息