DatabaseBackend.java

  1package de.gultsch.chat.persistance;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5
  6import de.gultsch.chat.entities.Account;
  7import de.gultsch.chat.entities.Contact;
  8import de.gultsch.chat.entities.Conversation;
  9import de.gultsch.chat.entities.Message;
 10import android.content.Context;
 11import android.database.Cursor;
 12import android.database.sqlite.SQLiteDatabase;
 13import android.database.sqlite.SQLiteOpenHelper;
 14import android.util.Log;
 15
 16public class DatabaseBackend extends SQLiteOpenHelper {
 17
 18	private static DatabaseBackend instance = null;
 19
 20	private static final String DATABASE_NAME = "history";
 21	private static final int DATABASE_VERSION = 1;
 22
 23	public DatabaseBackend(Context context) {
 24		super(context, DATABASE_NAME, null, DATABASE_VERSION);
 25	}
 26
 27	@Override
 28	public void onCreate(SQLiteDatabase db) {
 29		db.execSQL("PRAGMA foreign_keys=ON;");
 30		db.execSQL("create table " + Account.TABLENAME + "(" + Account.UUID
 31				+ " TEXT PRIMARY KEY," + Account.USERNAME + " TEXT,"
 32				+ Account.SERVER + " TEXT," + Account.PASSWORD + " TEXT,"
 33				+ Account.ROSTERVERSION + " TEXT," + Account.OPTIONS
 34				+ " NUMBER)");
 35		db.execSQL("create table " + Conversation.TABLENAME + " ("
 36				+ Conversation.UUID + " TEXT PRIMARY KEY, " + Conversation.NAME
 37				+ " TEXT, " + Conversation.PHOTO_URI + " TEXT, "
 38				+ Conversation.ACCOUNT + " TEXT, " + Conversation.CONTACT
 39				+ " TEXT, " + Conversation.CREATED + " NUMBER, "
 40				+ Conversation.STATUS + " NUMBER," + "FOREIGN KEY("
 41				+ Conversation.ACCOUNT + ") REFERENCES " + Account.TABLENAME
 42				+ "(" + Account.UUID + ") ON DELETE CASCADE);");
 43		db.execSQL("create table " + Message.TABLENAME + "( " + Message.UUID
 44				+ " TEXT PRIMARY KEY, " + Message.CONVERSATION + " TEXT, "
 45				+ Message.TIME_SENT + " NUMBER, " + Message.COUNTERPART
 46				+ " TEXT, " + Message.BODY + " TEXT, " + Message.ENCRYPTION
 47				+ " NUMBER, " + Message.STATUS + " NUMBER," + "FOREIGN KEY("
 48				+ Message.CONVERSATION + ") REFERENCES "
 49				+ Conversation.TABLENAME + "(" + Conversation.UUID
 50				+ ") ON DELETE CASCADE);");
 51		db.execSQL("create table " + Contact.TABLENAME + "(" + Contact.UUID
 52				+ " TEXT PRIMARY KEY, " + Contact.ACCOUNT + " TEXT, "
 53				+ Contact.DISPLAYNAME + " TEXT," + Contact.JID + " TEXT,"
 54				+ Contact.LASTONLINEPRESENCE + " NUMBER, " + Contact.OPENPGPKEY
 55				+ " TEXT," + Contact.PHOTOURI + " TEXT," + Contact.SUBSCRIPTION
 56				+ " TEXT," + Contact.SYSTEMACCOUNT + " NUMBER, "
 57				+ "FOREIGN KEY(" + Contact.ACCOUNT + ") REFERENCES "
 58				+ Account.TABLENAME + "(" + Account.UUID
 59				+ ") ON DELETE CASCADE);");
 60	}
 61
 62	@Override
 63	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
 64		// TODO Auto-generated method stub
 65
 66	}
 67
 68	public static synchronized DatabaseBackend getInstance(Context context) {
 69		if (instance == null) {
 70			instance = new DatabaseBackend(context);
 71		}
 72		return instance;
 73	}
 74
 75	public void createConversation(Conversation conversation) {
 76		SQLiteDatabase db = this.getWritableDatabase();
 77		db.insert(Conversation.TABLENAME, null, conversation.getContentValues());
 78	}
 79
 80	public void createMessage(Message message) {
 81		SQLiteDatabase db = this.getWritableDatabase();
 82		db.insert(Message.TABLENAME, null, message.getContentValues());
 83	}
 84
 85	public void createAccount(Account account) {
 86		SQLiteDatabase db = this.getWritableDatabase();
 87		db.insert(Account.TABLENAME, null, account.getContentValues());
 88	}
 89
 90	public int getConversationCount() {
 91		SQLiteDatabase db = this.getReadableDatabase();
 92		Cursor cursor = db.rawQuery("select count(uuid) as count from "
 93				+ Conversation.TABLENAME + " where " + Conversation.STATUS
 94				+ "=" + Conversation.STATUS_AVAILABLE, null);
 95		cursor.moveToFirst();
 96		return cursor.getInt(0);
 97	}
 98
 99	public List<Conversation> getConversations(int status) {
100		List<Conversation> list = new ArrayList<Conversation>();
101		SQLiteDatabase db = this.getReadableDatabase();
102		String[] selectionArgs = { "" + status };
103		Cursor cursor = db.rawQuery("select * from " + Conversation.TABLENAME
104				+ " where " + Conversation.STATUS + " = ? order by "
105				+ Conversation.CREATED + " desc", selectionArgs);
106		while (cursor.moveToNext()) {
107			list.add(Conversation.fromCursor(cursor));
108		}
109		return list;
110	}
111
112	public List<Message> getMessages(Conversation conversation, int limit) {
113		List<Message> list = new ArrayList<Message>();
114		SQLiteDatabase db = this.getReadableDatabase();
115		String[] selectionArgs = { conversation.getUuid() };
116		Cursor cursor = db.query(Message.TABLENAME, null, Message.CONVERSATION
117				+ "=?", selectionArgs, null, null, Message.TIME_SENT + " DESC",
118				String.valueOf(limit));
119		if (cursor.getCount() > 0) {
120			cursor.moveToLast();
121			do {
122				list.add(Message.fromCursor(cursor));
123			} while (cursor.moveToPrevious());
124		}
125		return list;
126	}
127
128	public Conversation findConversation(Account account, String contactJid) {
129		SQLiteDatabase db = this.getReadableDatabase();
130		String[] selectionArgs = { account.getUuid(), contactJid };
131		Cursor cursor = db.query(Conversation.TABLENAME, null,
132				Conversation.ACCOUNT + "=? AND " + Conversation.CONTACT + "=?",
133				selectionArgs, null, null, null);
134		if (cursor.getCount() == 0)
135			return null;
136		cursor.moveToFirst();
137		return Conversation.fromCursor(cursor);
138	}
139
140	public void updateConversation(Conversation conversation) {
141		SQLiteDatabase db = this.getWritableDatabase();
142		String[] args = { conversation.getUuid() };
143		db.update(Conversation.TABLENAME, conversation.getContentValues(),
144				Conversation.UUID + "=?", args);
145	}
146
147	public List<Account> getAccounts() {
148		List<Account> list = new ArrayList<Account>();
149		SQLiteDatabase db = this.getReadableDatabase();
150		Cursor cursor = db.query(Account.TABLENAME, null, null, null, null,
151				null, null);
152		Log.d("gultsch", "found " + cursor.getCount() + " accounts");
153		while (cursor.moveToNext()) {
154			list.add(Account.fromCursor(cursor));
155		}
156		return list;
157	}
158
159	public void updateAccount(Account account) {
160		SQLiteDatabase db = this.getWritableDatabase();
161		String[] args = { account.getUuid() };
162		db.update(Account.TABLENAME, account.getContentValues(), Account.UUID
163				+ "=?", args);
164	}
165
166	public void deleteAccount(Account account) {
167		SQLiteDatabase db = this.getWritableDatabase();
168		String[] args = { account.getUuid() };
169		Log.d("gultsch", "backend trying to delete account with uuid:"
170				+ account.getUuid());
171		db.delete(Account.TABLENAME, Account.UUID + "=?", args);
172	}
173
174	@Override
175	public SQLiteDatabase getWritableDatabase() {
176		SQLiteDatabase db = super.getWritableDatabase();
177		db.execSQL("PRAGMA foreign_keys=ON;");
178		return db;
179	}
180
181	public void updateMessage(Message message) {
182		SQLiteDatabase db = this.getWritableDatabase();
183		String[] args = { message.getUuid() };
184		db.update(Message.TABLENAME, message.getContentValues(), Message.UUID
185				+ "=?", args);
186	}
187}