package edu.mit.mitmobile2.qrreader; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class QRCodeDB { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "qrreader.db"; private static final String QRCODES_TABLE = "qrcodes"; private static final String ID = "_id"; private static final String URL = "title"; private static final String IMAGE = "image"; private static final String DATE = "date"; SQLiteOpenHelper mQRCodeDBHelper; private static QRCodeDB qrcodeDBInstance = null; public static QRCodeDB getInstance(Context context) { if(qrcodeDBInstance == null) { qrcodeDBInstance = new QRCodeDB(context); return qrcodeDBInstance; } else { return qrcodeDBInstance; } } private QRCodeDB(Context context) { mQRCodeDBHelper = new QRCodeDatabaseHelper(context); } public synchronized List<QRCode> getQRCodes() { SQLiteDatabase db = mQRCodeDBHelper.getReadableDatabase(); Cursor cursor = db.query(QRCODES_TABLE, null, null, null, null, null, DATE + " DESC"); int url_index = cursor.getColumnIndex(URL); int image_index = cursor.getColumnIndex(IMAGE); int date_index = cursor.getColumnIndex(DATE); ArrayList<QRCode> qrcodes = new ArrayList<QRCode>(); if(cursor.moveToFirst()) { while(!cursor.isAfterLast()) { String url = cursor.getString(url_index); byte[] imageBytes = cursor.getBlob(image_index); Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); Date date = new Date(cursor.getLong(date_index)); qrcodes.add(new QRCode(url, bitmap, date)); cursor.moveToNext(); } } cursor.close(); db.close(); return qrcodes; } public synchronized void insertQRCode(QRCode qrcode) { SQLiteDatabase db = mQRCodeDBHelper.getWritableDatabase(); ContentValues qrcodeValues = new ContentValues(); qrcodeValues.put(URL, qrcode.getId()); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); qrcode.getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, ostream); qrcodeValues.put(IMAGE, ostream.toByteArray()); qrcodeValues.put(DATE, qrcode.getDate().getTime()); db.insert(QRCODES_TABLE, URL, qrcodeValues); mQRCodeDBHelper.close(); } public synchronized void removeOldestQRCode() { SQLiteDatabase db = mQRCodeDBHelper.getWritableDatabase(); Cursor cursor = db.query(QRCODES_TABLE, null, null, null, null, null, DATE + " ASC", "1"); int id_index = cursor.getColumnIndex(ID); Integer oldestID = null; if(cursor.moveToFirst()) { oldestID = cursor.getInt(id_index); } cursor.close(); if(oldestID != null) { db.delete(QRCODES_TABLE, ID + "=?", new String[] {Integer.toString(oldestID)}); } db.close(); } public synchronized int qrcodesCount() { SQLiteDatabase db = mQRCodeDBHelper.getReadableDatabase(); Cursor cursor = db.query(QRCODES_TABLE, new String[] {ID}, null, null, null, null, null); int count = cursor.getCount(); cursor.close(); db.close(); return count; } private static class QRCodeDatabaseHelper extends SQLiteOpenHelper { QRCodeDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + QRCODES_TABLE + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + URL + " TEXT," + IMAGE + " BLOB," + DATE + " INTEGER" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // no old versions exists } } }