/*
This file is part of BeepMe.
BeepMe is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
BeepMe is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with BeepMe. If not, see <http://www.gnu.org/licenses/>.
Copyright 2012-2014 Michael Glanznig
http://beepme.yourexp.at
*/
package com.glanznig.beepme.db;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import com.glanznig.beepme.data.Tag;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class TagTable extends StorageHandler {
private static final String TAG = "TagTable";
private static final String TBL_NAME = "tag";
private static final String TBL_CREATE =
"CREATE TABLE IF NOT EXISTS " + TBL_NAME + " (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT NOT NULL, " +
"vocabulary_id INTEGER NOT NULL, " +
"FOREIGN KEY(vocabulary_id) REFERENCES " + VocabularyTable.getTableName() + "(_id)" +
")";
public TagTable(Context ctx) {
super(ctx);
}
public static String getTableName() {
return TBL_NAME;
}
public static void createTable(SQLiteDatabase db) {
db.execSQL(TBL_CREATE);
//createMoodEntries(db);
}
public static void dropTable(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TBL_NAME);
}
public static void truncateTable(SQLiteDatabase db) {
dropTable(db);
createTable(db);
}
/*private static void createMoodEntries(SQLiteDatabase db) {
ContentValues values = null;
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "begeistert");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "verzückt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "hingerissen");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "wütend");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "zornig");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "aufgebracht");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "böse");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "traurig");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "bekümmert");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "niedergeschlagen");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "schüchtern");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "scheu");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "zurückhaltend");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "angeekelt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "empört");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "entrüstet");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "erfreut");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "froh");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "glücklich");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "anmaßend");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "überheblich");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "herablassend");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "überrascht");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "erstaunt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "verblüfft");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "vorsichtig");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "behutsam");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "zaghaft");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "cool");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "gespannt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "aufgeregt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "erregt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "geil");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "genervt");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "erschrocken");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "einsam");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "zuversichtlich");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "optimistisch");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "eigensinnig");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "entschlossen");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "entschieden");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "energisch");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "selbstsicher");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "großartig");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 1);
values.put("name", "brilliant");
db.insert(TBL_NAME, null, values);
values.put("vocabulary_id", 2);
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "gar nicht");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "nicht");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "eher nicht");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "wenig");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "kaum");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "eher schon");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "aufmerksam");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "eher sehr");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "sehr");
db.insert(TBL_NAME, null, values);
values = new ContentValues();
values.put("vocabulary_id", 3);
values.put("name", "vollkommen");
db.insert(TBL_NAME, null, values);
}*/
public Tag addTag(long vocabularyId, String tagName, long sampleId) {
if (tagName != null && sampleId != 0L) {
SQLiteDatabase db = getDb();
ContentValues values = null;
long tagId = 0L;
boolean success = true;
db.beginTransaction();
Cursor cursor = db.query(getTableName(), new String[] { "_id", "name", "vocabulary_id" },
"name=? AND vocabulary_id=?", new String[] { tagName.toLowerCase(Locale.getDefault()), String.valueOf(vocabularyId) },
null, null, null);
if (cursor != null && cursor.getCount() == 0) {
values = new ContentValues();
values.put("name", tagName.toLowerCase(Locale.getDefault()));
values.put("vocabulary_id", vocabularyId);
tagId = db.insert(getTableName(), null, values);
}
else {
cursor.moveToFirst();
tagId = cursor.getLong(0);
}
if (cursor != null) {
cursor.close();
}
if (success) {
if (tagId != 0L) {
values = new ContentValues();
values.put("sample_id", sampleId);
values.put("tag_id", tagId);
try {
db.insertOrThrow(SampleTagTable.getTableName(), null, values);
}
catch (SQLiteConstraintException sce) {
Log.e(TAG, "error insert tag relation", sce);
success = false;
}
}
else {
success = false;
}
}
if (success) {
db.setTransactionSuccessful();
}
db.endTransaction();
db.close();
if (success) {
Tag t = new Tag(tagId);
t.setName(tagName.toLowerCase(Locale.getDefault()));
t.setVocabularyId(vocabularyId);
return t;
}
}
return null;
}
public boolean removeTag(long vocabularyId, String tagName, long sampleId) {
boolean success = true;
if (vocabularyId != 0L && tagName != null && sampleId != 0L) {
SQLiteDatabase db = getDb();
db.beginTransaction();
//delete tag - sample relationship
int rows = db.delete(SampleTagTable.getTableName(),
"tag_id = (SELECT t._id FROM " + getTableName() +
" t WHERE t.name=? AND t.vocabulary_id=?) AND sample_id=?",
new String[] { tagName.toLowerCase(Locale.getDefault()), String.valueOf(vocabularyId), String.valueOf(sampleId) });
if (rows > 0) {
Cursor cursor = db.rawQuery("SELECT sample_id FROM " + SampleTagTable.getTableName() +
" st INNER JOIN " + getTableName() + " t ON st.tag_id = t._id WHERE t.name=? AND t.vocabulary_id=?",
new String[] { tagName.toLowerCase(Locale.getDefault()), String.valueOf(vocabularyId) });
//if there are no other samples attached to this tag -> delete tag
if (cursor != null) {
if (cursor.getCount() == 0) {
rows = db.delete(getTableName(), "name=? AND vocabulary_id=?",
new String[] { tagName.toLowerCase(Locale.getDefault()), String.valueOf(vocabularyId) });
if (rows == 0) {
success = false;
}
}
cursor.close();
}
else {
success = false;
}
}
else {
success = false;
}
if (success) {
db.setTransactionSuccessful();
}
db.endTransaction();
db.close();
}
else {
success = false;
}
return success;
}
public List<Tag> getTags(long vocabularyId, String search) {
ArrayList<Tag> list = new ArrayList<Tag>();
SQLiteDatabase db = getDb();
Cursor cursor = db.query(getTableName(), new String[] { "_id", "name" },
"name like '" + search + "%' AND vocabulary_id=?", new String[] { String.valueOf(vocabularyId) },
null, null, "name");
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
Tag t = null;
do {
t = new Tag(cursor.getLong(0));
t.setName(cursor.getString(1));
list.add(t);
}
while (cursor.moveToNext());
cursor.close();
}
db.close();
return list;
}
public List<Tag> getTags(long vocabularyId) {
ArrayList<Tag> list = new ArrayList<Tag>();
SQLiteDatabase db = getDb();
Cursor cursor = db.query(getTableName(), new String[] { "_id", "name" }, "vocabulary_id=?",
new String[] { String.valueOf(vocabularyId) }, null, null, "name");
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
Tag t = null;
do {
t = new Tag(cursor.getLong(0));
t.setName(cursor.getString(1));
list.add(t);
}
while (cursor.moveToNext());
cursor.close();
}
db.close();
return list;
}
}