package com.seafile.seadroid2.avatar;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.google.common.collect.Lists;
import com.seafile.seadroid2.SeadroidApplication;
import com.seafile.seadroid2.account.Account;
public class AvatarDBHelper extends SQLiteOpenHelper {
private static final String DEBUG_TAG = "AvatarDBHelper";
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "avatar.db";
private static final String AVATAR_TABLE_NAME = "Avatar";
private static final String AVATAR_COLUMN_ID = "id";
private static final String AVATAR_COLUMN_SIGNATURE = "signature";
private static final String AVATAR_COLUMN_URL = "url";
private static final String AVATAR_COLUMN_MTIME = "mtime";
/*private static final String AVATAR_COLUMN_IS_DEFAULT = "is_default";*/
private static final String SQL_CREATE_AVATAR_TABLE =
"CREATE TABLE " + AVATAR_TABLE_NAME + " ("
+ AVATAR_COLUMN_ID + " INTEGER PRIMARY KEY, "
+ AVATAR_COLUMN_SIGNATURE + " TEXT NOT NULL, "
+ AVATAR_COLUMN_URL + " TEXT NOT NULL, "
+ AVATAR_COLUMN_MTIME + " INTEGER NOT NULL);";
private static final String[] projection = {
//AVATAR_COLUMN_ID,
AVATAR_COLUMN_SIGNATURE,
AVATAR_COLUMN_URL,
AVATAR_COLUMN_MTIME
/*AVATAR_COLUMN_IS_DEFAULT*/
};
public static final String [] hasAvatarProjection = {
AVATAR_COLUMN_SIGNATURE,
AVATAR_COLUMN_URL,
AVATAR_COLUMN_MTIME
};
private static AvatarDBHelper dbHelper = null;
private SQLiteDatabase database = null;
public static synchronized AvatarDBHelper getAvatarDbHelper() {
if (dbHelper != null)
return dbHelper;
dbHelper = new AvatarDBHelper(SeadroidApplication.getAppContext());
dbHelper.database = dbHelper.getWritableDatabase();
return dbHelper;
}
private AvatarDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public boolean hasAvatar(Account account) {
if (account == null)
return false;
if (account.getSignature() == null || account.getSignature().isEmpty())
return false;
String selection = AVATAR_COLUMN_SIGNATURE + "=?";
Cursor cursor = database.query(
AVATAR_TABLE_NAME,
hasAvatarProjection,
selection,
new String[]{account.getSignature()},
null,
null,
null
);
boolean hasAvatar = false;
if (cursor.moveToFirst())
hasAvatar = true;
cursor.close();
return hasAvatar;
}
public List<Avatar> getAvatarList() {
Cursor cursor = database.query(
AVATAR_TABLE_NAME,
projection,
null,
null,
null, // don't group the rows
null, // don't filter by row groups
null // The sort order
);
List<Avatar> avatars = new ArrayList<Avatar>();
if (!cursor.moveToFirst())
return avatars;
do {
Avatar avatar = new Avatar();
avatar.setSignature(cursor.getString(0));
avatar.setUrl(cursor.getString(1));
avatar.setMtime(cursor.getInt(2));
/*avatar.setIs_default(cursor.getInt(3) == 1);*/
avatars.add(avatar);
} while (cursor.moveToNext());
cursor.close();
return avatars;
}
public void saveAvatars(List<Avatar> avatars) {
List<Avatar> validAvatars = Lists.newArrayList();
// query database in case insert duplicate rows
for (Avatar avatar : avatars) {
if (!isRowDuplicate(avatar)) {
validAvatars.add(avatar);
}
}
for (Avatar avatar : validAvatars) {
ContentValues values = new ContentValues();
values.put(AVATAR_COLUMN_SIGNATURE, avatar.getSignature());
values.put(AVATAR_COLUMN_URL, avatar.getUrl());
values.put(AVATAR_COLUMN_MTIME, avatar.getMtime());
/*values.put(AVATAR_COLUMN_IS_DEFAULT, (avatar.isIs_default() ? 1 : 0));*/
database.insert(AVATAR_TABLE_NAME, null, values);
}
}
// avoid duplicate inserting request
private boolean isRowDuplicate(Avatar avatar) {
long count = DatabaseUtils.queryNumEntries(
database,
AVATAR_TABLE_NAME,
AVATAR_COLUMN_SIGNATURE + "=? and " +
AVATAR_COLUMN_URL + "=?",
new String[]{avatar.getSignature(), avatar.getUrl()});
return count > 0;
}
@Override
public void onCreate(SQLiteDatabase db) {
createAvatarTable(db);
}
private void createAvatarTable(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_AVATAR_TABLE);
db.execSQL("CREATE INDEX account_signature_index ON " + AVATAR_TABLE_NAME
+ " (" + AVATAR_COLUMN_SIGNATURE + ");");
db.execSQL("CREATE INDEX avatar_url_index ON " + AVATAR_TABLE_NAME
+ " (" + AVATAR_COLUMN_URL + ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + AVATAR_TABLE_NAME + ";");
onCreate(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}