Android如何通过content provider构建媒体文件数据库
2010-09-27 01:52:00 来源:WEB开发网sStorageURI == content://media/external/sdcard/media/
Authority是 media所以将调用MediaProvider::insert,在insert中生成文件保存的路径并放在key为_data项数据区。再通过 ContentResolver访问MediaProvider调用openFile打开文件并将Image或media数据写入。
Camera,Image gallery应用启动后不会扫描文件系统而是根据数据库的记录来进行列表并显示。这样做无疑效率比较高。
文件的删除
数据库中保存有文件的路径名,当调用delete从数据库中删除一个记录后,记录中_data保存的文件名(绝对路径)所指的文件也被删除了。而在应用程序中是找不到删除文件的代码,这个困扰了我两天,在程序中加log,分析源代码,最终屏蔽MediaProvider中的一段代码找到了一点线索:
public int delete(Uri uri, String userWhere, String[] whereArgs) {
int count;
int match = URI_MATCHER.match(uri);
……………………………..
if (match != VOLUMES_ID) {
DatabaseHelper database = getDatabaseForUri(uri);
if (database == null) {
throw new UnsupportedOperationException(
"Unknown URI: " + uri);
}
SQLiteDatabase db = database.getWritableDatabase();
synchronized (sGetTableAndWhereParam) {
getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam);
switch (match) {
case AUDIO_MEDIA:
case AUDIO_MEDIA_ID:
count = db.delete("audio_meta",
sGetTableAndWhereParam.where, whereArgs);
break;
default:
// count = db.delete(sGetTableAndWhereParam.table,
// sGetTableAndWhereParam.where, whereArgs);
break;
}
getContext().getContentResolver().notifyChange(uri, null);
}
}
……………………..
}
将上面红色代码注掉以后发现文件没有被删除,而红色代码只是对数据库进行操作,因而文件应该是在清除数据库的记录时候被删除的。仔细查看创建table的代码发现几个语句很奇怪,由于没有网络去搜索一下关于android
更多精彩
赞助商链接