1c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/* 28ab8b411b81e4581060a31a97a0cb204a803b2e5Mike Lockwood * Copyright (C) 2008 The Android Open Source Project 3c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 4c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * use this file except in compliance with the License. You may obtain a copy of 6c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * the License at 7c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 8c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 10c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * License for the specific language governing permissions and limitations under 14c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * the License. 15c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 16c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 17191d898468d2f4910a684f429bec518320843744Mike Lockwoodpackage com.android.locationtracker.data; 18c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 19c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentProvider; 20c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentUris; 21c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentValues; 22c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.Context; 23c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.Cursor; 24c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.sqlite.SQLiteDatabase; 25c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.sqlite.SQLiteOpenHelper; 26c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.net.Uri; 27c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.util.Log; 28c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 29c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/** 30c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Content provider for location tracking. 31c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 32c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * It is recommended to use the TrackerDataHelper class to access this data 33c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * rather than this class directly 34c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 35c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodpublic class TrackerProvider extends ContentProvider { 36c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 37c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public static final Uri CONTENT_URI = Uri 38191d898468d2f4910a684f429bec518320843744Mike Lockwood .parse("content://com.android.locationtracker"); 39c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 40c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private static final String DB_NAME = "tracking.db"; 41c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private static final String TABLE_NAME = "tracking"; 42c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private static final int DB_VERSION = 1; 43c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 44c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private static final String LOG_TAG = "TrackerProvider"; 45c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 46c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 47c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * This class helps open, create, and upgrade the database file. 48c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 49c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private static class DatabaseHelper extends SQLiteOpenHelper { 50c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 51c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood DatabaseHelper(Context context) { 52c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood super(context, DB_NAME, null, DB_VERSION); 53c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 54c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 55c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 56c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public void onCreate(SQLiteDatabase db) { 57c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood StringBuilder queryBuilder = new StringBuilder(); 58c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood queryBuilder.append(String.format("CREATE TABLE %s (", TABLE_NAME)); 59c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood TrackerEntry.buildCreationString(queryBuilder); 60c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 61c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood queryBuilder.append(");"); 62c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood db.execSQL(queryBuilder.toString()); 63c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood db.setVersion(DB_VERSION); 64c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 65c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 66c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 67c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 68c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood // TODO: reimplement this when dB version changes 69c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood Log.w(LOG_TAG, "Upgrading database from version " + oldVersion 70c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood + " to " + newVersion 71c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood + ", which will destroy all old data"); 72c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 73c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood onCreate(db); 74c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 75c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 76c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 77c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private DatabaseHelper mOpenHelper; 78c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 79c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 80c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public boolean onCreate() { 81c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood mOpenHelper = new DatabaseHelper(getContext()); 82c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return true; 83c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 84c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 85c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 86c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public int delete(Uri uri, String selection, String[] selectionArgs) { 87c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 88c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood int result = db.delete(TABLE_NAME, selection, selectionArgs); 89c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood getContext().getContentResolver().notifyChange(uri, null); 90c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return result; 91c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 92c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 93c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 94c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getType(Uri uri) { 95c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood throw new UnsupportedOperationException(); 96c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 97c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 98c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 99c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public Uri insert(Uri uri, ContentValues values) { 100c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 101c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood long rowId = db.insert(TABLE_NAME, null, values); 102c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood if (rowId > 0) { 103c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood Uri addedUri = ContentUris.withAppendedId(CONTENT_URI, rowId); 104c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood getContext().getContentResolver().notifyChange(addedUri, null); 105c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return addedUri; 106c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 107c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return null; 108c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 109c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 110c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 111c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public Cursor query(Uri uri, String[] projection, String selection, 112c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood String[] selectionArgs, String sortOrder) { 113c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 114c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood // TODO: extract limit from URI ? 115c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood Cursor cursor = db.query(TABLE_NAME, projection, selection, 116c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood selectionArgs, null, null, sortOrder); 117c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood getContext().getContentResolver().notifyChange(uri, null); 118c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return cursor; 119c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 120c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 121c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood @Override 122c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public int update(Uri uri, ContentValues values, String selection, 123c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood String[] selectionArgs) { 124c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood throw new UnsupportedOperationException(); 125c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 126c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood} 127