Android MediaProvider数据库分析

今天有一个关于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。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值