如何通过contentprovider构建媒体文件数据库

上传人:re****.1 文档编号:511330938 上传时间:2022-09-07 格式:DOC 页数:9 大小:28KB
返回 下载 相关 举报
如何通过contentprovider构建媒体文件数据库_第1页
第1页 / 共9页
如何通过contentprovider构建媒体文件数据库_第2页
第2页 / 共9页
如何通过contentprovider构建媒体文件数据库_第3页
第3页 / 共9页
如何通过contentprovider构建媒体文件数据库_第4页
第4页 / 共9页
如何通过contentprovider构建媒体文件数据库_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《如何通过contentprovider构建媒体文件数据库》由会员分享,可在线阅读,更多相关《如何通过contentprovider构建媒体文件数据库(9页珍藏版)》请在金锄头文库上搜索。

1、Android如何通过content provider构建媒体文献数据库Android为 Camera,Audio,Video等媒体文献提供MediaProvider用于数据的保存,删除,检索等。MediaProvider实现了 ContentProvider类的几种操作SQL的重要措施如insert ,delete, updata, query。MediaProvider中DatabaseHelper类用于获取与创立Database。private static final class DatabaseHelper extends SQLiteOpenHelper final Context

2、 mContext;final boolean mInternal; / True if this is the internal database/ In memory caches of artist and album data.HashMap mArtistCache = new HashMap();HashMap mAlbumCache = new HashMap();public DatabaseHelper(Context context, String name, boolean internal) super(context, name, null, DATABASE_VER

3、SION);mContext = context;mInternal = internal;/* Creates database the first time we try to open it.*/Override /第一次打开数据库时创立Tablepublic void onCreate(final SQLiteDatabase db) updateDatabase(db, mInternal, 0, DATABASE_VERSION);以Camera的image文献文献为例,数据库在第一次使用的时候被创立,对于image文献,SQL在updateDatabase为其创立一种table:

4、db.execSQL(CREATE TABLE IF NOT EXISTS images ( +_id INTEGER PRIMARY KEY, + /文献保存的序号_data TEXT, + /记录image 文献保存途径_size INTEGER, + /文献大小_display_name TEXT, + /图片名称mime_type TEXT, + /文献类型title TEXT, +date_added INTEGER, +date_modified INTEGER, +description TEXT, +picasa_id TEXT, +isprivate INTEGER, +la

5、titude DOUBLE, +longitude DOUBLE, +datetaken INTEGER, +orientation INTEGER, +mini_thumb_magic INTEGER, +bucket_id TEXT, +bucket_display_name TEXT +););添加URI到match这个也很重要,由于不同类型的文献会保存在不同的table中,如果我们得到一种URI为: content:/media/external/images/media/1 通过UriMatcher.match(uri)将返回注册的IMAGES_MEDIA_ID值。URI_MATCH

6、ER.addURI(media, */images/media, IMAGES_MEDIA);URI_MATCHER.addURI(media, */images/media/#, IMAGES_MEDIA_ID);URI格式解析如下:URI格式中最重要的字段是authority,authority拟定了操作数据库的Provider是由谁提供的。MediaProvider在AndroidManifest.xml中添加如下语句:Provider加载MediaProvider安装在手机中,ContentResolver通过acquireProvider祈求加载Provider程序。acquireP

7、rovider正是通过解析URI中的authority字段,在安装的package中查找与此authority相符的Provider,如果此Provider没有被加载ActivityMangerService将加载Provider程序,这个过程可以参照我此前写的Activity是如何加载的文章。 Provider究竟是加载到调用Provider的应用程序还是将Provider程序加载到ActivityManagerService中作为 system Provider这个我不太拟定是如何辨别的,反正这两种方式都是可行的,总之按照sdk help 文档上的方式创立Provider程序,androi

8、d会自动加载的。记录的保存与获取当Camera拍照完毕或者是media play文献需要保存的时候,一方面要构造保存的数据构造ContentValues values = new ContentValues(7);values.put(Images.Media.TITLE, imageName);values.put(Images.Media.DISPLAY_NAME, imageName);values.put(Images.Media.DESCRIPTION, description);values.put(Images.Media.DATE_TAKEN, dateTaken);value

9、s.put(Images.Media.MIME_TYPE, image/jpeg);values.put(Images.Media.ORIENTATION, orientation);Uri uri = cr.insert(sStorageURI, values); /保存到数据库sStorageURI = content:/media/external/sdcard/media/Authority是 media因此将调用MediaProvider:insert,在insert中生成文献保存的途径并放在key为_data项数据区。再通过 ContentResolver访问MediaProvid

10、er调用openFile打开文献并将Image或media数据写入。Camera,Image gallery应用启动后不会扫描文献系统而是根据数据库的记录来进行列表并显示。这样做无疑效率比较高。文献的删除数据库中保存有文献的途径名,当调用delete从数据库中删除一种记录后,记录中_data保存的文献名(绝对途径)所指的文献也被删除了。而在应用程序中是找不到删除文献的代码,这个困扰了我两天,在程序中加log,分析源代码,最后屏蔽MediaProvider中的一段代码找到了一点线索:public int delete(Uri uri, String userWhere, String where

11、Args) 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) getT

12、ableAndWhere(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;getCon

13、text().getContentResolver().notifyChange(uri, null);.将上面红色代码注掉后来发现文献没有被删除,而红色代码只是对数据库进行操作,因而文献应当是在清除数据库的记录时候被删除的。仔细查看创立table的代码发现几种语句很奇怪,由于没有网络去搜索一下有关android SQL的knowledge 只能猜想这个语句的意思了固然也怪偶没去学学SQL。 db.execSQL(CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON images +BEGIN +DELETE FROM thumbnails

14、 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_valu

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号