DatabaseUtils.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:5k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.app;
  18. import android.content.ContentResolver;
  19. import android.content.ContentUris;
  20. import android.content.ContentValues;
  21. import android.database.Cursor;
  22. import android.graphics.Bitmap;
  23. import android.graphics.BitmapFactory;
  24. import android.graphics.drawable.BitmapDrawable;
  25. import android.graphics.drawable.Drawable;
  26. import android.net.Uri;
  27. import android.provider.Im;
  28. public class DatabaseUtils {
  29.     private DatabaseUtils() {
  30.     }
  31.     public static Cursor queryAccountsForProvider(ContentResolver cr,
  32.             String[] projection, long providerId) {
  33.         StringBuilder where = new StringBuilder(Im.Account.ACTIVE);
  34.         where.append("=1 AND ").append(Im.Account.PROVIDER).append('=').append(providerId);
  35.         Cursor c = cr.query(Im.Account.CONTENT_URI, projection, where.toString(), null, null);
  36.         if (c != null && !c.moveToFirst()) {
  37.             c.close();
  38.             return null;
  39.         }
  40.         return c;
  41.     }
  42.     public static Drawable getAvatarFromCursor(Cursor cursor, int dataColumn) {
  43.         byte[] rawData = cursor.getBlob(dataColumn);
  44.         if (rawData == null) {
  45.             return null;
  46.         }
  47.         return decodeAvatar(rawData);
  48.     }
  49.     public static Uri getAvatarUri(Uri baseUri, long providerId, long accountId) {
  50.         Uri.Builder builder = baseUri.buildUpon();
  51.         ContentUris.appendId(builder, providerId);
  52.         ContentUris.appendId(builder, accountId);
  53.         return builder.build();
  54.     }
  55.     public static Drawable getAvatarFromCursor(Cursor cursor, int dataColumn,
  56.             int encodedDataColumn, String username, boolean updateBlobUseCursor,
  57.             ContentResolver resolver, Uri updateBlobUri) {
  58.         /**
  59.          * Optimization: the avatar table in IM content provider have two
  60.          * columns, one for the raw blob data, another for the base64 encoded
  61.          * data. The reason for this is when the avatars are initially
  62.          * downloaded, they are in the base64 encoded form, and instead of
  63.          * base64 decode the avatars for all the buddies up front, we can just
  64.          * simply store the encoded data in the table, and decode them on demand
  65.          * when displaying them. Once we decode the avatar, we store the decoded
  66.          * data as a blob, and null out the encoded column in the avatars table.
  67.          * query the raw blob data first, if present, great; if not, query the
  68.          * encoded data, decode it and store as the blob, and null out the
  69.          * encoded column.
  70.          */
  71.         byte[] rawData = cursor.getBlob(dataColumn);
  72.         if (rawData == null) {
  73.             String encodedData = cursor.getString(encodedDataColumn);
  74.             if (encodedData == null) {
  75.                 // Log.e(LogTag.LOG_TAG, "getAvatarFromCursor for " + username +
  76.                 // ", no raw or encoded data!");
  77.                 return null;
  78.             }
  79.             rawData = android.os.Base64Utils.decodeBase64(encodedData);
  80.             // if (DBG) {
  81.             // log("getAvatarFromCursor for " + username + ": found encoded
  82.             // data,"
  83.             // + " update blob with data, len=" + rawData.length);
  84.             // }
  85.             if (updateBlobUseCursor) {
  86.                 cursor.updateBlob(dataColumn, rawData);
  87.                 cursor.updateString(encodedDataColumn, null);
  88.                 cursor.commitUpdates();
  89.             } else {
  90.                 updateAvatarBlob(resolver, updateBlobUri, rawData, username);
  91.             }
  92.         }
  93.         return decodeAvatar(rawData);
  94.     }
  95.     private static void updateAvatarBlob(ContentResolver resolver, Uri updateUri, byte[] data,
  96.             String username) {
  97.         ContentValues values = new ContentValues(3);
  98.         values.put(Im.Avatars.DATA, data);
  99.         StringBuilder buf = new StringBuilder(Im.Avatars.CONTACT);
  100.         buf.append("=?");
  101.         String[] selectionArgs = new String[] {
  102.             username
  103.         };
  104.         resolver.update(updateUri, values, buf.toString(), selectionArgs);
  105.     }
  106.     private static Drawable decodeAvatar(byte[] data) {
  107.         Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
  108.         Drawable avatar = new BitmapDrawable(b);
  109.         return avatar;
  110.     }
  111. }