• Android 4 学习(17):使用Content Resolver


    Content Resolver简介

    每个应用程序都有一个ContentResolver实例,通过getContentResolver()方法可以获取:

     

    ContentResolver cr = getContentResolver();

     

    Content Provider对应,Content Resolver用于使用Content Provider发布的数据。使用ContentResolver查询ConentProvider提供的数据:

     

    // Get the Content Resolver.
    ContentResolver cr = getContentResolver();
    // Specify the result column projection. Return the minimum set of columns required to satisfy your requirements.
    String[] result_columns = new String[] {
      MyHoardContentProvider.KEY_ID,
      MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
      MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
    // Specify the where clause that will limit your results.
    String where = MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + “=” + 1;
    // Replace these with valid SQL statements as necessary.
    String whereArgs[] = null;
    String order = null;
    // Return the specified rows.
    Cursor resultCursor = cr.query(MyHoardContentProvider.CONTENT_URI, result_columns, where, whereArgs, order);

     

    Cursor中解析数据的方法和上一篇博文中介绍的一样,首先要移动到指定行,然后从指定列中获取对应类型的数据:

     

    float largestHoard = 0f;
    String hoardName = “No Hoards”;
    // Find the index to the column(s) being used.
    int GOLD_HOARDED_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
    MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN);
    int HOARD_NAME_COLUMN_INDEX = resultCursor.getColumnIndexOrThrow(
    MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN);
    // Iterate over the cursors rows.
    // The Cursor is initialized at before first, so we can
    // check only if there is a “next” row available. If the
    // result Cursor is empty, this will return false.
    while (resultCursor.moveToNext()) {
    float hoard = resultCursor.getFloat(GOLD_HOARDED_COLUMN_INDEX);
    if (hoard > largestHoard) {
    largestHoard = hoard;
    hoardName = resultCursor.getString(HOARD_NAME_COLUMN_INDEX);
    }
    }
    // Close the Cursor when you’ve finished with it.
    resultCursor.close();

     

    使用Cursor Loader进行异步查询

    Cursor Loader存在于在每个ActivityFragment中,可以实现异步查询和监听底层数据的变化。例如管理Cursor的生命周期,确保在Activity退出之前Cursor被关闭。

     

    实现LoaderCallbacks接口

     

    若要使用Cursor Loader,首先要实现LoaderManager.LoaderCallbacks接口:

     

    LoaderManager.LoaderCallbacks<Cursor> loaderCallback = new LoaderManager.LoaderCallbacks<Cursor>()

     

    LoaderCallback主要有这几个回调方法:

     

    • onCreateLoader
    • onLoadFinished
    • onLoaderReset
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
      // Construct the new query in the form of a Cursor Loader. Use the id
      // parameter to construct and return different loaders.
      String[] projection = null;
      String where = null;
      String[] whereArgs = null;
      String sortOrder = null;
      // Query URI
      Uri queryUri = MyContentProvider.CONTENT_URI;
      // Create the new Cursor loader.
      return new CursorLoader(DatabaseSkeletonActivity.this, queryUri,projection, where, whereArgs, sortOrder);
    }
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
      // Replace the result Cursor displayed by the Cursor Adapter with the new result set.
      adapter.swapCursor(cursor);
      // This handler is not synchronized with the UI thread, so you will need to synchronize it before modifying any UI elements directly.
    }
    public void onLoaderReset(Loader<Cursor> loader) {
      // Remove the existing result Cursor from the List Adapter.
      adapter.swapCursor(null);
      // This handler is not synchronized with the UI thread, so you
      // will need to synchronize it before modifying any UI elements directly.
    }

    初始化和重启Cursor Loader

    ActivityFragment中,可以调用getLoaderManager获得Cursor Loader

     

    LoaderManager loaderManager = getLoaderManager();

     

    获取Cursor Loader

     

    Bundle args = null;
    loaderManager.initLoader(LOADER_ID, args, myLoaderCallbacks);

     

    LOADER_ID用于标识获得的loaderargs是可选参数,myLoaderCallbacks则是前面LoaderManager.LoaderCallbacks接口的实现。如果对应LOADER_ID的Cursor Loader不存在,那么系统会调用onCreateLoader方法来创建一个Loader

     

    使用Content Resolver增、改、删

    插入数据:

    // Create a new row of values to insert.
    ContentValues newValues = new ContentValues();
    // Assign values for each row.
    newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
    newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue);
    newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
    // [ ... Repeat for each column / value pair ... ]
    // Get the Content Resolver
    ContentResolver cr = getContentResolver();
    // Insert the row into your table
    Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);

    删除数据:

    // Specify a where clause that determines which row(s) to delete.
    // Specify where arguments as necessary.
    String where = MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN + =” + 0;
    String whereArgs[] = null;
    // Get the Content Resolver.
    ContentResolver cr = getContentResolver();
    // Delete the matching rows
    int deletedRowCount = cr.delete(MyHoardContentProvider.CONTENT_URI, where, whereArgs);

    修改数据:

    // Create the updated row content, assigning values for each row.
    ContentValues updatedValues = new ContentValues();
    updatedValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, newHoardValue);
    // [ ... Repeat for each column to update ... ]
    // Create a URI addressing a specific row.
    Uri rowURI = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, hoardId);
    // Specify a specific row so no selection clause is required.
    String where = null;
    String whereArgs[] = null;
    // Get the Content Resolver.
    ContentResolver cr = getContentResolver();
    // Update the specified row.
    int updatedRowCount = cr.update(rowURI, updatedValues, where, whereArgs);

    使用Content Resolver读写Content Provider中的数据

    public void addNewHoardWithImage(String hoardName, float hoardValue, boolean hoardAccessible, Bitmap bitmap) {
      // Create a new row of values to insert.
      ContentValues newValues = new ContentValues();
      // Assign values for each row.
      newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
      newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue);
      newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
      // Get the Content Resolver
      ContentResolver cr = getContentResolver();
      // Insert the row into your table
      Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);
      try {
        // Open an output stream using the new row’s URI.
        OutputStream outStream = cr.openOutputStream(myRowUri);
        // Compress your bitmap and save it into your provider.
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
      }catch (FileNotFoundException e) {
        Log.d(TAG, “No file found for this record.”);
      }
    }
    public Bitmap getHoardImage(long rowId) {
      Uri myRowUri = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, rowId);
      try {
        // Open an input stream using the new row’s URI.
        InputStream inStream = getContentResolver().openInputStream(myRowUri);
        // Make a copy of the Bitmap.
        Bitmap bitmap = BitmapFactory.decodeStream(inStream);
        return bitmap;
      }catch (FileNotFoundException e) {
        Log.d(TAG, “No file found for this record.”);
      }
      return null;
    }

     

     

     

     

     

     

     

     

  • 相关阅读:
    从C,C++,JAVA和C#来看String库的发展(二)---JAVA和C#篇
    从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇
    C++ 对象的内存布局
    vlc sdl2.0 播放示例
    wafer2-nodejs 本地部署服务器
    python socket编程腾讯云下报错[Errno 99] Cannot assign requested address的解决方式
    小程序setData()使用和注意事项
    wafer2的几个简单示例
    Node.js中的模块接口module.exports
    Koa 中间件的执行顺序
  • 原文地址:https://www.cnblogs.com/jubincn/p/3520964.html
Copyright © 2020-2023  润新知