Android如何通过content provider构建媒体文件数据库
2010-09-27 01:52:00 来源:WEB开发网db.execSQL("CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON images " +
"BEGIN " +
"DELETE FROM thumbnails WHERE image_id = old._id;" +
"SELECT _DELETE_FILE(old._data);" +
"END");
创建table为 images的触发器,DELETE FROM thumbnails WHERE image_id = old._id正是删除thumbnails的意思,对于Camera创建的Images会生成一个小图片保存为thumbnail,这个记录也是自动清除的。 "SELECT _DELETE_FILE(old._data);" 应该是删除文件的意思。
在Sqlite3_android.cpp文件中还真找到delete_file这个函数,加上log,进入gallery选择一个文件删除,打出了删除文件名的全路径。
static void delete_file(sqlite3_context * context, int argc, sqlite3_value ** argv)
{
………………….
if (strncmp("/sdcard/", path, 8) != 0) { //只能删除sdcard/路径下的东西要删除其他路
sqlite3_result_null(context); //还需稍微改造一下
return;
}
……………………
}
如何将文件保存在手机上
MediaProvider中存在两个数据库一个是external对应文件系统为SD Card, 一个是内部数据库internal用于手机flash上的文件系统。遗憾的是虽然MediaProvider提供了操作内外两个数据库的功能,但在发布的应用中并没有使用这个内部文件系统。Android 默认状态下Image,audio等文件是保存在SD card上。External, internal 数据库都保存在手机文件系统上
Path: /data/data/com.android.providers.media/database/
如果要使用内部文件系统需要修改以下几个地方
1:MediaProvider generateFileName函数
private String generateFileName(boolean internal, String preferredExtension, String directoryName)
{
// create a random file
String name = String.valueOf(System.currentTimeMillis());
if (internal) {
throw new UnsupportedOperationException("Writing to internal storage is not supported.");
// return Environment.getDataDirectory()
更多精彩
赞助商链接