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}