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。
现象是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。
相关文章推荐
- Android MediaProvider 数据库模式
- Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置
- Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置
- Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置
- Android数据库greenDAO框架用法和源码分析
- Android数据库一些源码分析
- Android MediaScanner 详尽分析
- Android端与web端以及数据库的建立它们之间的交互详解与案例分析
- ContentProvider原理分析二 MediaProvider publish .
- Android MediaStore裁剪图片分析
- java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDo
- Android源码分析之仿OrmLite数据库框架
- Android中AppWidget的分析与应用:AppWidgetProvider .
- Android 数据库操作过程分析
- Android 6.0 申请权限Permission Denial: reading com.android.providers.media.MediaProvider
- android Media Route Provider
- Android 短信模块分析(八) MMS数据库表关系
- android Xutils 数据库操作源码分析
- Android 短信数据库详细总结分析
- Android 最好的数据库框架 ORMLite的分析 (附时序图和自己写的DEMO)