WidgetDatabaseHelper.java revision 2b3ee0ea07246b859a5b75d8a6102a7cce7ec838
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17d6db8eab6df048b9065834113a6d46a885af01d3Owen Linpackage com.android.gallery3d.gadget; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentValues; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.Cursor; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.sqlite.SQLiteDatabase; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.sqlite.SQLiteException; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.sqlite.SQLiteOpenHelper; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.util.Log; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 292b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.common.Utils; 302b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.ByteArrayOutputStream; 32d6db8eab6df048b9065834113a6d46a885af01d3Owen Linimport java.util.ArrayList; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class WidgetDatabaseHelper extends SQLiteOpenHelper { 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoDatabaseHelper"; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String DATABASE_NAME = "launcher.db"; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int DATABASE_VERSION = 4; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TABLE_WIDGETS = "widgets"; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String FIELD_APPWIDGET_ID = "appWidgetId"; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String FIELD_IMAGE_URI = "imageUri"; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String FIELD_PHOTO_BLOB = "photoBlob"; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String FIELD_WIDGET_TYPE = "widgetType"; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String FIELD_ALBUM_PATH = "albumPath"; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final int TYPE_SINGLE_PHOTO = 0; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final int TYPE_SHUFFLE = 1; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final int TYPE_ALBUM = 2; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String[] PROJECTION = { 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin FIELD_WIDGET_TYPE, FIELD_IMAGE_URI, FIELD_PHOTO_BLOB, FIELD_ALBUM_PATH}; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int INDEX_WIDGET_TYPE = 0; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int INDEX_IMAGE_URI = 1; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int INDEX_PHOTO_BLOB = 2; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int INDEX_ALBUM_PATH = 3; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String WHERE_CLAUSE = FIELD_APPWIDGET_ID + " = ?"; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static class Entry { 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int widgetId; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int type; 63d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin public String imageUri; 64d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin public byte imageData[]; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String albumPath; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin private Entry() {} 68d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Entry(int id, Cursor cursor) { 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin widgetId = id; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = cursor.getInt(INDEX_WIDGET_TYPE); 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (type == TYPE_SINGLE_PHOTO) { 73d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin imageUri = cursor.getString(INDEX_IMAGE_URI); 74d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin imageData = cursor.getBlob(INDEX_PHOTO_BLOB); 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (type == TYPE_ALBUM) { 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin albumPath = cursor.getString(INDEX_ALBUM_PATH); 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public WidgetDatabaseHelper(Context context) { 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super(context, DATABASE_NAME, null, DATABASE_VERSION); 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(SQLiteDatabase db) { 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin db.execSQL("CREATE TABLE " + TABLE_WIDGETS + " (" 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + FIELD_APPWIDGET_ID + " INTEGER PRIMARY KEY, " 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + FIELD_WIDGET_TYPE + " INTEGER DEFAULT 0, " 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + FIELD_IMAGE_URI + " TEXT, " 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + FIELD_ALBUM_PATH + " TEXT, " 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + FIELD_PHOTO_BLOB + " BLOB)"); 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin private void saveData(SQLiteDatabase db, int oldVersion, ArrayList<Entry> data) { 96d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin if (oldVersion <= 2) { 97d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin Cursor cursor = db.query("photos", 98d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin new String[] {FIELD_APPWIDGET_ID, FIELD_PHOTO_BLOB}, 99d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin null, null, null, null, null); 100d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin if (cursor == null) return; 101d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin try { 102d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin while (cursor.moveToNext()) { 103d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin Entry entry = new Entry(); 104d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.type = TYPE_SINGLE_PHOTO; 105d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.widgetId = cursor.getInt(0); 106d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.imageData = cursor.getBlob(1); 107d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin data.add(entry); 108d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 109d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } finally { 110d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin cursor.close(); 111d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 112d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } else if (oldVersion == 3) { 113d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin Cursor cursor = db.query("photos", 114d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin new String[] {FIELD_APPWIDGET_ID, FIELD_PHOTO_BLOB, FIELD_IMAGE_URI}, 115d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin null, null, null, null, null); 116d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin if (cursor == null) return; 117d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin try { 118d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin while (cursor.moveToNext()) { 119d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin Entry entry = new Entry(); 120d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.type = TYPE_SINGLE_PHOTO; 121d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.widgetId = cursor.getInt(0); 122d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.imageData = cursor.getBlob(1); 123d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin entry.imageUri = cursor.getString(2); 124d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin data.add(entry); 125d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 126d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } finally { 127d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin cursor.close(); 128d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 129d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 130d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 131d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin 132d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin private void restoreData(SQLiteDatabase db, ArrayList<Entry> data) { 133d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin db.beginTransaction(); 134d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin try { 135d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin for (Entry entry : data) { 136d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin ContentValues values = new ContentValues(); 137d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin values.put(FIELD_APPWIDGET_ID, entry.widgetId); 138d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin values.put(FIELD_WIDGET_TYPE, entry.type); 139d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin values.put(FIELD_IMAGE_URI, entry.imageUri); 140d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin values.put(FIELD_PHOTO_BLOB, entry.imageData); 141d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin values.put(FIELD_ALBUM_PATH, entry.albumPath); 142d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin db.insert(TABLE_WIDGETS, null, values); 143d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 144d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin db.setTransactionSuccessful(); 145d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } finally { 146d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin db.endTransaction(); 147d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 148d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin } 149d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int version = oldVersion; 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (version != DATABASE_VERSION) { 155d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin ArrayList<Entry> data = new ArrayList<Entry>(); 156d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin saveData(db, oldVersion, data); 157d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "destroying all old data."); 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Table "photos" is renamed to "widget" in version 4 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin db.execSQL("DROP TABLE IF EXISTS photos"); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin db.execSQL("DROP TABLE IF EXISTS " + TABLE_WIDGETS); 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onCreate(db); 163d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin 164d6db8eab6df048b9065834113a6d46a885af01d3Owen Lin restoreData(db, data); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin /** 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Store the given bitmap in this database for the given appWidgetId. 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean setPhoto(int appWidgetId, Uri imageUri, Bitmap bitmap) { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Try go guesstimate how much space the icon will take when 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // serialized to avoid unnecessary allocations/copies during 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // the write. 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int size = bitmap.getWidth() * bitmap.getHeight() * 4; 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ByteArrayOutputStream out = new ByteArrayOutputStream(size); 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin out.close(); 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ContentValues values = new ContentValues(); 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_APPWIDGET_ID, appWidgetId); 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_WIDGET_TYPE, TYPE_SINGLE_PHOTO); 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_IMAGE_URI, imageUri.toString()); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_PHOTO_BLOB, out.toByteArray()); 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SQLiteDatabase db = getWritableDatabase(); 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin db.replaceOrThrow(TABLE_WIDGETS, null, values); 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable e) { 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "set widget photo fail", e); 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean setWidget(int id, int type, String albumPath) { 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ContentValues values = new ContentValues(); 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_APPWIDGET_ID, id); 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_WIDGET_TYPE, type); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin values.put(FIELD_ALBUM_PATH, Utils.ensureNotNull(albumPath)); 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getWritableDatabase().replaceOrThrow(TABLE_WIDGETS, null, values); 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable e) { 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "set widget fail", e); 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Entry getEntry(int appWidgetId) { 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Cursor cursor = null; 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SQLiteDatabase db = getReadableDatabase(); 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cursor = db.query(TABLE_WIDGETS, PROJECTION, 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WHERE_CLAUSE, new String[] {String.valueOf(appWidgetId)}, 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin null, null, null); 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (cursor == null || !cursor.moveToNext()) { 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "query fail: empty cursor: " + cursor); 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new Entry(appWidgetId, cursor); 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable e) { 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "Could not load photo from database", e); 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.closeSilently(cursor); 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin /** 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Remove any bitmap associated with the given appWidgetId. 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void deleteEntry(int appWidgetId) { 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SQLiteDatabase db = getWritableDatabase(); 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin db.delete(TABLE_WIDGETS, WHERE_CLAUSE, 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[] {String.valueOf(appWidgetId)}); 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (SQLiteException e) { 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "Could not delete photo from database", e); 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}