package com.pinthecloud.athere.database;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.pinthecloud.athere.AhApplication;
import com.pinthecloud.athere.helper.UserHelper;
import com.pinthecloud.athere.model.AhUser;
public class UserDBHelper extends SQLiteOpenHelper {
// All Static variables
// Database Version
private static int DATABASE_VERSION = 2;
// Database Name
private static final String DATABASE_NAME = "userManagerDB";
// Users table name
private final String TABLE_NAME = "users";
// Users Table Columns names
private final String ID = "id";
private final String AH_ID = "ah_id";
private final String MOBILE_ID = "mobile_id";
private final String MOBILE_TYPE = "mobile_type";
private final String REGISTRATION_ID = "registration_id";
private final String IS_MALE = "is_male";
private final String BIRTH_YEAR = "birth_year";
private final String PROFILE_PIC = "profile_pic";
private final String NICK_NAME = "nick_name";
private final String IS_CHUPA_ENABLE = "is_chupa_enable";
private final String HAS_BEEN_OUT = "has_been_out";
private SQLiteDatabase mDb;
private AtomicInteger mCount = new AtomicInteger();
public UserDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/*
* Creating Tables(non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
*/
private SQLiteDatabase openDatabase(String name) {
// Log.e("ERROR", "open : " + name);
if (mCount.incrementAndGet() == 1) {
mDb = this.getWritableDatabase();
}
return mDb;
}
private void closeDatabase(String name) {
// Log.e("ERROR", "close : " + name);
if (mCount.decrementAndGet() == 0) {
mDb.close();
}
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
"("
+ ID + " TEXT PRIMARY KEY,"
+ AH_ID + " TEXT,"
+ MOBILE_ID + " TEXT,"
+ MOBILE_TYPE + " TEXT,"
+ REGISTRATION_ID + " TEXT,"
+ IS_MALE + " INTEGER,"
+ BIRTH_YEAR + " INTEGER,"
+ PROFILE_PIC + " TEXT,"
+ NICK_NAME + " TEXT,"
+ IS_CHUPA_ENABLE + " INTEGER,"
+ HAS_BEEN_OUT + " INTEGER"
+")";
db.execSQL(CREATE_TABLE);
}
/*
* Upgrading database(non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
// Create tables again
onCreate(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
// Create tables again
onCreate(db);
}
public void dropTable(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
}
/**
* All CRUD(Create, Read, Update, Delete) Operations
*/
public void addUser(AhUser user) {
if (user == null) return;
SQLiteDatabase db = this.openDatabase("addUser");
ContentValues values = setAndGetValue(user);
db.insert(TABLE_NAME, null, values);
this.closeDatabase("addUser");
}
public void addAllUsers(List<AhUser> list){
if (list == null || list.size() == 0) return;
SQLiteDatabase db = this.openDatabase("addAllUsers");
for(AhUser user : list){
ContentValues values = setAndGetValue(user);
db.insert(TABLE_NAME, null, values);
}
this.closeDatabase("addAllUsers");
}
private ContentValues setAndGetValue(AhUser user) {
ContentValues values = new ContentValues();
values.put(ID, user.getId());
values.put(AH_ID, user.getAhId());
values.put(MOBILE_ID, user.getMobileId());
values.put(MOBILE_TYPE, user.getMobileType());
values.put(REGISTRATION_ID, user.getRegistrationId());
values.put(IS_MALE, user.isMale());
values.put(BIRTH_YEAR, user.getBirthYear());
values.put(PROFILE_PIC, user.getProfilePic());
values.put(NICK_NAME, user.getNickName());
values.put(IS_CHUPA_ENABLE, user.isChupaEnable());
values.put(HAS_BEEN_OUT, false);
return values;
}
public synchronized AhUser getUser(String id, boolean includingExits){
SQLiteDatabase db = this.openDatabase("getUser(String id, boolean includingExits)");
UserHelper userHelper = AhApplication.getInstance().getUserHelper();
AhUser user = userHelper.getAdminUser(id);
String query = ID + "=?";
String[] args = new String[] { id };
if (!includingExits) {
query = ID + "=? and " + HAS_BEEN_OUT + "=?";
args = new String[] { id, "0" };
}
Cursor cursor = db.query(TABLE_NAME, null, query, args, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
user = convertToUser(cursor);
}
this.closeDatabase("getUser(String id, boolean includingExits)");
return user;
}
public boolean isUserExist(String userId){
boolean isExist = false;
SQLiteDatabase db = this.openDatabase("isUserExist");
Cursor cursor = db.query(TABLE_NAME, null, ID + "=?",
new String[] { userId }, null, null, null, null);
if (cursor != null) {
isExist = cursor.moveToFirst();
}
this.closeDatabase("isUserExist");
return isExist;
}
public synchronized boolean isUserExit(String userId) {
boolean isExit = false;
SQLiteDatabase db = this.openDatabase("isUserExit(String userId)");
Cursor cursor = db.query(TABLE_NAME, new String[]{ HAS_BEEN_OUT }, ID + "=?",
new String[] { userId }, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
if (cursor.getInt(0) == 1){
isExit = true;
} else {
isExit = false;
}
}
this.closeDatabase("isUserExit(String userId)");
return isExit;
}
public void addIfNotExistOrUpdate(AhUser user){
if (user == null) return;
if (this.isUserExist(user.getId())){
this.updateUser(user);
}
else {
this.addUser(user);
}
}
public List<AhUser> getAllUsers(boolean includingExits) {
List<AhUser> users = new ArrayList<AhUser>();
String selectQuery = "SELECT * FROM " + TABLE_NAME;
String[] args = null;
if (!includingExits) {
selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + HAS_BEEN_OUT + "=?";
args = new String[] { "0" };
}
SQLiteDatabase db = this.openDatabase("getAllUsers(boolean includingExits)");
Cursor cursor = db.rawQuery(selectQuery, args);
if (cursor != null && cursor.moveToFirst()) {
do {
users.add(convertToUser(cursor));
} while (cursor.moveToNext());
}
this.closeDatabase("getAllUsers(boolean includingExits)");
return users;
}
public void updateUser(AhUser user) {
if (user == null) return;
SQLiteDatabase db = this.openDatabase("updateUser");
ContentValues values = setAndGetValue(user);
db.update(TABLE_NAME, values, ID + "=?", new String[] { user.getId() });
this.closeDatabase("updateUser");
}
public void deleteUser(String id) {
SQLiteDatabase db = this.openDatabase("deleteUser");
db.delete(TABLE_NAME, ID + " = ?", new String[] { id });
this.closeDatabase("deleteUser");
}
public void exitUser(String id) {
if (id == null || id.equals("")) return;
SQLiteDatabase db = this.openDatabase("exitUser(String id)");
ContentValues values = new ContentValues();
values.put(HAS_BEEN_OUT, true);
db.update(TABLE_NAME, values, ID + "=?", new String[] { id });
this.closeDatabase("exitUser(String id)");
}
public void deleteAllUsers() {
SQLiteDatabase db = this.openDatabase("deleteAllUsers");
db.delete(TABLE_NAME, null, null);
this.closeDatabase("deleteAllUsers");
}
private AhUser convertToUser(Cursor cursor) {
AhUser user = new AhUser();
String _id = cursor.getString(0);
String ahId = cursor.getString(1);
String mobileId = cursor.getString(2);
String mobileType = cursor.getString(3);
String registrationId = cursor.getString(4);
boolean isMale = cursor.getInt(5) == 1;
int birthYear = cursor.getInt(6);
String profilePic = cursor.getString(7);
String nickName = cursor.getString(8);
boolean chupaEnable = cursor.getInt(9) == 1;
user.setId(_id);
user.setAhId(ahId);
user.setMobileId(mobileId);
user.setMobileType(mobileType);
user.setRegistrationId(registrationId);
user.setMale(isMale);
user.setBirthYear(birthYear);
user.setProfilePic(profilePic);
user.setNickName(nickName);
user.setChupaEnable(chupaEnable);
return user;
}
}