/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.database.tables;
import java.util.List;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import com.vodafone360.people.Settings;
import com.vodafone360.people.database.DatabaseHelper;
import com.vodafone360.people.utils.CloseUtils;
import com.vodafone360.people.utils.LogUtils;
/**
* Contains all the functionality related to the contact source database table.
* This table stores a list of source information for each contact. This class
* is never instantiated hence all methods must be static.
*
* @version %I%, %G%
*/
public abstract class ContactSourceTable {
/**
* Name of the table as it appears in the database
*/
public static final String TABLE_NAME = "ContactSources";
/**
* Represents the data stored in a record
*/
private static class ContactSource {
/**
* The local contact ID which maps to contacts table
*/
private Long mLocalContactId;
/**
* The source string
*/
private String mSource;
}
/**
* An enumeration of all the field names in the database.
*/
private static enum Field {
SOURCEID("SourceId"),
LOCALCONTACTID("LocalContactId"),
SOURCE("Source");
/**
* The name of the field as it appears in the database
*/
private String mField;
/**
* Constructor
*
* @param field - The name of the field (see list above)
*/
private Field(String field) {
mField = field;
}
/**
* @return the name of the field as it appears in the database.
*/
public String toString() {
return mField;
}
}
/**
* Create Contact Source Table.
*
* @param writeableDb A writable SQLite database
* @throws SQLException If an SQL compilation error occurs
*/
public static void create(SQLiteDatabase writeableDb) throws SQLException {
DatabaseHelper.trace(true, "ContactSourceTable.onCreate()");
writeableDb.execSQL("CREATE TABLE " + TABLE_NAME + " (" + Field.SOURCEID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + Field.LOCALCONTACTID + " LONG, "
+ Field.SOURCE + " STRING);");
}
/**
* Returns a ContentValues object that can be used to insert or update a
* contact source in the table.
*
* @param contactSource A ContactSource object with the local Contact ID and
* source set appropriately.
* @return The ContactValues object
*/
private static ContentValues fillUpdateData(ContactSource contactSource) {
DatabaseHelper.trace(false, "ContactSourceTable.fillUpdateData()");
ContentValues contactValues = new ContentValues();
contactValues.put(Field.LOCALCONTACTID.toString(), contactSource.mLocalContactId);
contactValues.put(Field.SOURCE.toString(), contactSource.mSource);
return contactValues;
}
/**
* Add contact source to contact
*
* @param localContactId The local Contact ID from Contacts table
* @param source The source string from the server
* @param writeableDb A writable SQLite database
* @return true if successful, false otherwise
*/
public static boolean addContactSource(long localContactId, String source,
SQLiteDatabase writableDb) {
DatabaseHelper.trace(true, "ContactSourceTable.addContactSource()");
try {
final ContactSource contactSource = new ContactSource();
contactSource.mLocalContactId = localContactId;
contactSource.mSource = source;
final ContentValues values = fillUpdateData(contactSource);
if (writableDb.insertOrThrow(TABLE_NAME, null, values) < 0) {
LogUtils.logE("ContactSourceTable.addContactSource() "
+ "Unable to insert new contact source");
return false;
}
return true;
} catch (SQLException e) {
LogUtils.logE("ContactSourceTable.addContactSource() SQLException - "
+ "Unable to insert new contact source", e);
return false;
}
}
/**
* Removes all sources associated with a specific contact.
*
* @param localContactId The local Contact ID from Contacts table
* @param writeableDb A writable SQLite database
* @return true if successful, false otherwise
*/
public static boolean deleteAllContactSources(long localContactId, SQLiteDatabase writableDb) {
DatabaseHelper.trace(true, "ContactSourceTable.deleteAllContactSources()");
try {
if (writableDb.delete(TABLE_NAME, Field.LOCALCONTACTID + "=" + localContactId, null) < 0) {
LogUtils.logE("ContactSourceTable.deleteAllContactSources() "
+ "Unable to delete contact sources");
return false;
}
return true;
} catch (SQLException e) {
LogUtils.logE("ContactSourceTable.deleteAllContactSources() SQLException - "
+ "Unable to delete all contact sources", e);
return false;
}
}
/**
* Fetches all the sources for the specified contact
*
* @param localContactId The local Contact ID from Contacts table
* @param sourceList A list that will be populated with the source strings
* @param readableDb A readable SQLite database
* @return true if successful, false otherwise
*/
public static boolean fetchContactSources(long localContactId, List<String> sourceList,
SQLiteDatabase readableDb) {
if (Settings.ENABLED_DATABASE_TRACE) {
DatabaseHelper.trace(false, "ContactSourceTable.fetchContactSources() localContactId["
+ localContactId + "]");
}
String[] args = {
String.format("%d", localContactId)
};
Cursor c1 = null;
sourceList.clear();
try {
c1 = readableDb.rawQuery("SELECT " + Field.SOURCE + " FROM " + TABLE_NAME + " WHERE "
+ Field.LOCALCONTACTID + " = ?", args);
while (c1.moveToNext()) {
if (!c1.isNull(0)) {
sourceList.add(c1.getString(0));
}
}
} catch (SQLiteException e) {
LogUtils.logE("ContactSourceTable.fetchContactSources() "
+ "Exception - Unable to fetch contact sources", e);
return false;
} finally {
CloseUtils.close(c1);
c1 = null;
}
return true;
}
}