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;
14
15public class DatabaseBackend extends SQLiteOpenHelper {
16
17 private static DatabaseBackend instance = null;
18
19 private static final String DATABASE_NAME = "history";
20 private static final int DATABASE_VERSION = 1;
21
22 public DatabaseBackend(Context context) {
23 super(context, DATABASE_NAME, null, DATABASE_VERSION);
24 }
25
26 @Override
27 public void onCreate(SQLiteDatabase db) {
28 db.execSQL("create table " + Conversation.TABLENAME + " ("
29 + Conversation.UUID + " TEXT PRIMARY KEY, " + Conversation.NAME
30 + " TEXT, " + Conversation.PHOTO_URI + " TEXT, "
31 + Conversation.ACCOUNT + " TEXT, " + Conversation.CONTACT
32 + " TEXT, " + Conversation.CREATED + " NUMBER, "
33 + Conversation.STATUS + " NUMBER)");
34 db.execSQL("create table " + Message.TABLENAME + "( " + Message.UUID
35 + " TEXT PRIMARY KEY, " + Message.CONVERSATION + " TEXT, " + Message.TIME_SENT +" NUMBER, "
36 + Message.COUNTERPART + " TEXT, " + Message.BODY + " TEXT, "
37 + Message.ENCRYPTION + " NUMBER, " + Message.STATUS
38 + " NUMBER)");
39 }
40
41 @Override
42 public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
43 // TODO Auto-generated method stub
44
45 }
46
47 public static synchronized DatabaseBackend getInstance(Context context) {
48 if (instance == null) {
49 instance = new DatabaseBackend(context);
50 }
51 return instance;
52 }
53
54 public void createConversation(Conversation conversation) {
55 SQLiteDatabase db = this.getWritableDatabase();
56 db.insert(Conversation.TABLENAME, null, conversation.getContentValues());
57 }
58
59 public void createMessage(Message message) {
60 SQLiteDatabase db = this.getWritableDatabase();
61 db.insert(Message.TABLENAME, null, message.getContentValues());
62 }
63
64 public int getConversationCount() {
65 SQLiteDatabase db = this.getReadableDatabase();
66 Cursor cursor = db.rawQuery(
67 "select count(uuid) as count from "+Conversation.TABLENAME+" where "+Conversation.STATUS+"="+Conversation.STATUS_AVAILABLE, null);
68 cursor.moveToFirst();
69 return cursor.getInt(0);
70 }
71
72 public List<Conversation> getConversations(int status) {
73 List<Conversation> list = new ArrayList<Conversation>();
74 SQLiteDatabase db = this.getReadableDatabase();
75 String[] selectionArgs = { "" + status };
76 Cursor cursor = db.rawQuery("select * from " + Conversation.TABLENAME
77 + " where " + Conversation.STATUS + " = ? order by "
78 + Conversation.CREATED + " desc", selectionArgs);
79 while (cursor.moveToNext()) {
80 list.add(Conversation.fromCursor(cursor));
81 }
82 return list;
83 }
84
85 public List<Message> getMessages(Conversation conversation, int limit) {
86 List<Message> list = new ArrayList<Message>();
87 SQLiteDatabase db = this.getReadableDatabase();
88 String[] selectionArgs = { conversation.getUuid() };
89 Cursor cursor = db.query(Message.TABLENAME, null,Message.CONVERSATION +"=?", selectionArgs, null, null,
90 Message.TIME_SENT+" DESC",String.valueOf(limit));
91 if (cursor.getCount() > 0 ) {
92 cursor.moveToLast();
93 do {
94 list.add(Message.fromCursor(cursor));
95 } while (cursor.moveToPrevious());
96 }
97 return list;
98 }
99
100 public Conversation findConversation(Account account, Contact contact) {
101 SQLiteDatabase db = this.getReadableDatabase();
102 String[] selectionArgs = { account.getUuid() , contact.getJid() };
103 Cursor cursor = db.query(Conversation.TABLENAME, null,Conversation.ACCOUNT+"=? AND "+Conversation.CONTACT+"=?", selectionArgs, null, null, null);
104 if (cursor.getCount() == 0) return null;
105 cursor.moveToFirst();
106 return Conversation.fromCursor(cursor);
107 }
108
109 public void updateConversation(Conversation conversation) {
110 SQLiteDatabase db = this.getReadableDatabase();
111 String[] args = {conversation.getUuid()};
112 db.update(Conversation.TABLENAME, conversation.getContentValues(),Conversation.UUID+"=?",args);
113 }
114
115}