关于ContentProvider 的介绍可以看前面两篇文章,就不多说废话了。

MediaProvider.java 代码如下,主要是使用SQLite3 创建media.db,然后再从android提供的MediaStore里获取数据,写进我们的数据库中。 建立两张表,musics和videos。

package ru.org.piaozhiye.dbdemo; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.Environment; import android.text.TextUtils; import android.util.Log; public class MediaProvider extends ContentProvider { public static final Uri MUSIC_CONTENT_URI = Uri .parse("content://ru.org.piaozhiye.MediaProvider/musics"); public static final Uri VIDEO_CONTENT_URI = Uri .parse("content://ru.org.piaozhiye.MediaProvider/videos"); @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri _uri, ContentValues values) { if (_uri.equals(MUSIC_CONTENT_URI)) { // Insert the new row, will return the row number if // successful. long rowID = DB.insert(MUSIC_TABLE, "music", values); // Return a URI to the newly inserted row on success. if (rowID > 0) { Uri uri = ContentUris.withAppendedId(MUSIC_CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(uri, null); return uri; } throw new SQLException("Failed to insert row into " + _uri); } else if (_uri.equals(VIDEO_CONTENT_URI)) { // Insert the new row, will return the row number if // successful. long rowID = DB.insert(VIDEO_TABLE, "video", values); // Return a URI to the newly inserted row on success. if (rowID > 0) { Uri uri = ContentUris.withAppendedId(MUSIC_CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(uri, null); return uri; } throw new SQLException("Failed to insert row into " + _uri); } else return null; } @Override public boolean onCreate() { Context context = getContext(); MediaDatabaseHelper dbHelper = new MediaDatabaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION); DB = dbHelper.getWritableDatabase(); Log.e(TAG, Environment.getExternalStorageDirectory().toString()); return (DB == null) ? false : true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sort) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); if (uri.equals(MUSIC_CONTENT_URI)) { qb.setTables(MUSIC_TABLE); // If this is a row query, limit the result set to the passed in // row. switch (uriMatcher.match(uri)) { case MUSIC_ID: qb.appendWhere(KEY_ID + "=" + uri.getPathSegments().get(1)); break; default: break; } // If no sort order is specified sort by date / time String orderBy; if (TextUtils.isEmpty(sort)) { orderBy = KEY_DATE; } else { orderBy = sort; } // Apply the query to the underlying database. Cursor c = qb.query(DB, projection, selection, selectionArgs, null, null, orderBy); // Register the contexts ContentResolver to be notified if // the cursor result set changes. c.setNotificationUri(getContext().getContentResolver(), uri); // Return a cursor to the query result. return c; } else if (uri.equals(VIDEO_CONTENT_URI)) { qb.setTables(VIDEO_TABLE); // If this is a row query, limit the result set to the passed in // row. switch (uriMatcher.match(uri)) { case VIDEO_ID: qb.appendWhere(KEY_ID + "=" + uri.getPathSegments().get(1)); break; default: break; } // If no sort order is specified sort by date / time String orderBy; if (TextUtils.isEmpty(sort)) { orderBy = KEY_DATE; } else { orderBy = sort; } // Apply the query to the underlying database. Cursor c = qb.query(DB, projection, selection, selectionArgs, null, null, orderBy); // Register the contexts ContentResolver to be notified if // the cursor result set changes. c.setNotificationUri(getContext().getContentResolver(), uri); // Return a cursor to the query result. return c; } return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } // Create the constants used to differentiate between the different URI // requests. private static final int MUSICS = 1; private static final int MUSIC_ID = 2; private static final int VIDEDOS = 3; private static final int VIDEO_ID = 4; private static final UriMatcher uriMatcher; // Allocate the UriMatcher object, where a URI ending in 'earthquakes' will // correspond to a request for all earthquakes, and 'earthquakes' with a // trailing '/[rowID]' will represent a single earthquake row. static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("ru.org.piaozhiye.MediaProvider", "musics", MUSICS); uriMatcher.addURI("ru.org.piaozhiye.MediaProvider", "musics/#", MUSIC_ID); uriMatcher.addURI("ru.org.piaozhiye.MediaProvider", "videos", VIDEDOS); uriMatcher.addURI("ru.org.piaozhiye.MediaProvider", "videos/#", VIDEO_ID); } // The underlying database private SQLiteDatabase DB; private static final String TAG = "MediaProvider"; private static final String DATABASE_NAME = "media.db"; private static final int DATABASE_VERSION = 2; private static final String MUSIC_TABLE = "musics"; private static final String VIDEO_TABLE = "videos"; // AUDIO Column Names public static final String KEY_ID = "_id"; public static final String KEY_PATH = "path"; public static final String KEY_TITLE = "title"; public static final String KEY_SIZE = "size"; public static final String KEY_DISPLAY_NAME = "displayname"; public static final String KEY_LASTPOSITON = "lastposition"; public static final String KEY_DURATION = "duration"; public static final String KEY_DATE = "date"; public static final String KEY_ARTIST = "artist"; public static final String KEY_ALBUM_NAME = "album"; public static final String KEY_ALBUM_ID = "albumId"; public static final String KEY_ALBUM_PATH = "albumpath"; public static final String KEY_ALBUM_ART = "albumart"; public static final String KEY_YEAR = "year"; public static final String KEY_TYPE = "type"; public static final String KEY_TRACK = "track"; public static final String KEY_RESULOTION = "resulotion"; // Helper class for opening, creating, and managing database version control private static class MediaDatabaseHelper extends SQLiteOpenHelper { private static final String MUSIC_DATABASE_CREATE = "create table " + MUSIC_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_PATH + " TEXT, " + KEY_TITLE + " TEXT, " // + KEY_ALBUM_ID + " TEXT, " + KEY_ALBUM_NAME + " TEXT, " + KEY_DURATION + " TEXT, " + KEY_ARTIST + " TEXT, " + KEY_DATE + " TEXT, " + KEY_SIZE + " TEXT, " + KEY_TRACK + " TEXT, " + KEY_YEAR + " TEXT, " + KEY_LASTPOSITON + " TEXT, " + KEY_TYPE + " TEXT" + ");"; private static final String VIDEO_DATABASE_CREATE = "create table " + VIDEO_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_PATH + " TEXT, " + KEY_DISPLAY_NAME + " TEXT, " + KEY_DURATION + " TEXT, " + KEY_DATE + " TEXT, " + KEY_SIZE + " TEXT, " + KEY_RESULOTION + " TEXT, " + KEY_LASTPOSITON + " TEXT" + ");"; public MediaDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // SQLiteDatabase.openOrCreateDatabase(DBPATH, null); db.execSQL(MUSIC_DATABASE_CREATE); db.execSQL(VIDEO_DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + MUSIC_TABLE); db.execSQL("DROP TABLE IF EXISTS " + VIDEO_TABLE); onCreate(db); } } }

MediaProvider 的使用,主要是从MediaStore 获取数据,然后将数据插入到数据库中。最后是实现通过ID查询数据的功能,代码如下:

package ru.org.piaozhiye.dbdemo; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; public class DBdemo extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Update myupdate = new Update(); myupdate.start(); // DBAdapter db = new DBAdapter(this); } class Update extends Thread { ContentResolver cr = getContentResolver(); String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0"; Cursor c = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, selection, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); ContentValues values = new ContentValues(); ContentValues values2 = new ContentValues(); Cursor c2 = getContentResolver().query( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER); public void run() { long begin = System.currentTimeMillis(); if (c.moveToFirst()) { do { values.put( MediaProvider.KEY_PATH, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA))); values.put( MediaProvider.KEY_TITLE, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE))); values.put( MediaProvider.KEY_ALBUM_NAME, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM))); values.put( MediaProvider.KEY_DURATION, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))); values.put( MediaProvider.KEY_ARTIST, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST))); values.put( MediaProvider.KEY_DATE, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.DATE_MODIFIED))); values.put( MediaProvider.KEY_SIZE, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE))); values.put( MediaProvider.KEY_TRACK, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.TRACK))); values.put( MediaProvider.KEY_YEAR, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.YEAR))); values.put(MediaProvider.KEY_LASTPOSITON, "0"); values.put( MediaProvider.KEY_TYPE, c.getString(c .getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE))); cr.insert(MediaProvider.MUSIC_CONTENT_URI, values); } while (c.moveToNext()); } values = null; c.close(); if (c2.moveToFirst()) { do { values2.put( MediaProvider.KEY_PATH, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.DATA))); values2.put( MediaProvider.KEY_DISPLAY_NAME, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME))); values2.put( MediaProvider.KEY_DURATION, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION))); values2.put( MediaProvider.KEY_DATE, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED))); values2.put( MediaProvider.KEY_SIZE, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.SIZE))); values2.put( MediaProvider.KEY_RESULOTION, c2.getString(c2 .getColumnIndexOrThrow(MediaStore.Video.Media.RESOLUTION))); values2.put(MediaProvider.KEY_LASTPOSITON, "0"); cr.insert(MediaProvider.VIDEO_CONTENT_URI, values2); } while (c2.moveToNext()); } // c2.close(); Log.e("DBdemo", "time is " + (System.currentTimeMillis() - begin)); c2.moveToPrevious(); Cursor c = getContentResolver() .query(MediaProvider.MUSIC_CONTENT_URI, new String[] { MediaProvider.KEY_ID, MediaProvider.KEY_PATH }, MediaProvider.KEY_ID + "=" + c2.getPosition(), null, null); c.moveToLast(); Log.e("Cursor", c.getString(0) + "-->" + c.getString(1) + ""); c2.close(); } } }

最后还要记得在manifest 中注册我们的provider

<provider android:name=".MediaProvider"

android:authorities="ru.org.piaozhiye.MediaProvider" />

一下是在shell 中查看数据库的一些命令,更详细的可以使用.help 命令。

[email protected]:~# adb shell # cd data/data/ru.org.piaozhiye.dbdemo # ls databases lib # cd databases # ls media.sb # rm media.sb # ls # exit [email protected]:~# adb shell # cd data/data/ru.org.piaozhiye.dbdemo # ls databases lib # cd databases # ls media.db # sqlite3 media.db SQLite version 3.5.9 Enter ".help" for instructions sqlite> .tables android_metadata musics videos sqlite> select * from videos; 1|/nand/video/02051_6.AVI|02051_6.AVI|341050|1292853006|12512408||0 2|/sdcard/MUSIC_TEST/Anyclub_part1.avi|Anyclub_part1.avi|365400|1132677768|23418762||0 3|/sdcard/video/Anyclub_part1.avi|Anyclub_part1.avi|365400|1132677768|23418762||0

demo 下载http://download.csdn.net/source/3312267

更多相关文章

  1. Android下pm 命令详解 - 安装/卸载/APK等
  2. Android判断当前网络是否可用--示例代码
  3. android 客户端与服务端的通信 发送get和post请求并获取数据
  4. 【Android】Android 监听网络状态+源代码
  5. 【Android】代码实现模拟屏幕点击和键盘按键事件
  6. Android SQLite 数据库 增删改查操作
  7. android 存储数据与文件

随机推荐

  1. XML-OpenSearch应用的具体介绍
  2. XML模式-Dublin Core的详解
  3. 介绍数据库生成xml的两个简单示例代码
  4. XML模式-FIXML和SVG的区别
  5. 详细介绍Mybatis在Xml中处理大于号和小于
  6. XML模式 -Dublin Core的详细介绍
  7. 简单介绍百度新闻开放协议XML文档制作方
  8. 详细介绍将XML数据转换成HTML的示例代码
  9. 数据中有'<'、'&'符号时,封装的XML就无法
  10. XML基本概念入门介绍