您的位置:首页 > 移动开发 > Android开发

Android MediaProvider数据库分析

2012-04-26 17:57 525 查看
今天有一个关于MediaProvider的问题,要解决,最后定位是数据库中的trigger问题。

现象是image数据库中的记录删除后,相应的文件也删除。

最后看到有trigger在其中,有一个_DELETE_FILE()很可疑。

所以在网上一查,真的是在trigger中将文件删除。

static void delete_file(sqlite3_context * context, int argc, sqlite3_value ** argv)

{

 ....

    int err = unlink(path);//unlink文件是删除文件的函数。

 ....

}

顺便又分析了以下MediaProvider的数据库,如下:

总共的表格有:

album_art            audio                media_scanner_paths

album_info           audio_genres         search             

albums               audio_genres_map     searchhelpertitle  

android_metadata     audio_meta           thumbnails         

artist_info          audio_playlists      video              

artists              audio_playlists_map  videothumbnails    

artists_albums_map   images  

audio表是一个view视图。创建过程如下:

他的删除会引发一个trigger,在trigger中实际上是删除了

audio_meta,audio_playlists_map,audio_genres_map中的对应条目。

sqlite> .dump audio

PRAGMA foreign_keys=OFF;

BEGIN TRANSACTION;

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;

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;

image表是一个实际存在的表,创建过程如下:

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);

这是一个trigger,在图片在删除时触发,它的动作包括:清除thumbnail.清除文件。。。(这个很有问题)

CREATE TRIGGER images_cleanup DELETE ON images BEGIN DELETE FROM thumbnails WHERE image_id = old._id;

//清除文件代码。  _DELETE_FILE(char *)是删除函数

SELECT _DELETE_FILE(old._data);END;

video表是一个实际存在的表,创建过程如下:

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);

它的删除会引发一个trigger.这个trigger没有完成应该完成的任务:删除video的缩略图(videothumbnails中)。

CREATE TRIGGER video_cleanup DELETE ON video BEGIN SELECT _DELETE_FILE(old._data);END;

videothumbnails(Video的缩略图存放处)

创建:

CREATE TABLE videothumbnails (_id INTEGER PRIMARY KEY,_data TEXT,video_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);

//添加记录

INSERT INTO "videothumbnails" VALUES(1,'/mnt/sdcard/DCIM/.thumbnails/1295976113784.jpg',1,1,96,96);

//创建索引

CREATE INDEX video_id_index on videothumbnails(video_id);

//trigger.在删除缩略图id后会删除缩略图文件。

CREATE TRIGGER videothumbnails_cleanup DELETE ON videothumbnails BEGIN SELECT _DELETE_FILE(old._data);END;

COMMIT;

thumbnails表存放的是image的缩略图。创建如下:

CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);

//插入数据

INSERT INTO "thumbnails" VALUES(14,'/mnt/sdcard/DCIM/.thumbnails/1295980763693.jpg',14,1,37,40);

INSERT INTO "thumbnails" VALUES(15,'/mnt/sdcard/DCIM/.thumbnails/1295980763899.jpg',15,1,140,105);

INSERT INTO "thumbnails" VALUES(16,'/mnt/sdcard/DCIM/.thumbnails/1295980763950.jpg',16,1,140,105);

INSERT INTO "thumbnails" VALUES(17,'/mnt/sdcard/DCIM/.thumbnails/1295980769207.jpg',17,1,610,666);

//创建索引

CREATE INDEX image_id_index on thumbnails(image_id);

//trigger.这个trigger是在缩略图在数据库中被删除后删除实体文件。

CREATE TRIGGER thumbnails_cleanup DELETE ON thumbnails BEGIN SELECT _DELETE_FILE(old._data);END;

COMMIT;

其他的一些表格都是与audio想关的一些表格。比较简单。有需要的自己看一下。

对于我们的项目,我们对数据库要做的事情

1.去掉删除图片,视频的数据库记录时,删除文件的trigger.

2.添加在video删除后,清理videothumbnails的trigger。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息