关于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 命令。

root@piaozhiye-laptop:~# adb shell # cd data/data/ru.org.piaozhiye.dbdemo # ls databases lib # cd databases # ls media.sb # rm media.sb # ls # exit root@piaozhiye-laptop:~# 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. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  4. android EditText设置不可写
  5. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  6. 《Android开发从零开始》——25.数据存储(4)
  7. Android系统配置数据库注释(settings.db)
  8. Android中不同应用间实现SharedPreferences数据共享
  9. android 获取唯一标识

随机推荐

  1. Android(安卓)OpenGLES 实现结构
  2. android自学笔记《二》——开发环境的搭
  3. 通过Titanium Studio为Android(安卓)APK
  4. Android(安卓)StatusBar相关设置
  5. Android(安卓)常用代码整理:Android(安卓)
  6. Android(安卓)之窗口小部件详解--App Wid
  7. Android(安卓)Handler 通信 - 彻底了解 H
  8. Android(安卓)XML Shape使用入门
  9. android json解析及简单例子
  10. android N 版本问题