@@ -8,44 +8,22 @@

import java.util.ArrayList;

import pt.ipp.estg.cmu.db.dbUtil;
import pt.ipp.estg.cmu.models.Nivel;
import pt.ipp.estg.cmu.models.Pergunta;

public class NivelRepo extends Repo implements RepositoryInterface<Nivel> {
public class NivelRepo extends Repo<Nivel> implements RepositoryInterface<Nivel> {

public NivelRepo(Context context) {
super(context, "nivel");
this.setFields();
}

private void setFields() {
this.addField("ID", "id");
this.addField("NUMERO", "numero");
this.addField("CATEGORIA", "categoria");
this.addField("N_PERGUNTAS", "nPerguntas");
this.addField("PONTUACAO_CERTA", "pontuacaoBase");
this.addField("PONTUACAO_ERRADA", "pontuacaoBaseErrada");
this.addField("PONTUACAO_DICA", "pontuacaoHint");
this.addField("BLOQUEADO", "bloqueado");
this.addField("N_PERGUNTAS", "nPerguntas");
this.addField("N_AJUDAS", "nAjudas");
this.addField("PONTUACAO", "pontuacao");
this.addField("N_RESPOSTAS_CERTAS", "nRespostasCertas");
this.addField("N_MIN_RESPOSTAS_CERTAS", "nMinRespostasCertas");

}

@Override
public ArrayList<Nivel> getAll() {
return null;
super(context, Nivel.TABLE);
}

@Override
public ArrayList<Nivel> getAllByField(String field, String value) {
String query = this.getAllByFieldQueryString(field, value);
ArrayList<Nivel> niveis = new ArrayList<>();
public ArrayList<Nivel> query(String[] tableColumns, String whereClause, String[] whereArgs, String orderBy) {
SQLiteDatabase db = super.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Cursor cursor = db.query(super.getTable(), tableColumns, whereClause, whereArgs,
null, null, orderBy);
ArrayList<Nivel> niveis = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
Nivel nivel = new Nivel();
@@ -67,100 +45,85 @@ public ArrayList<Nivel> getAllByField(String field, String value) {
cursor.close();
db.close();
return niveis;
}

/**
* Retorna todos os niveis com uma determinada categoria
*
* @param categoria
* @return
*/
public ArrayList<Nivel> getAllByCategoria(String categoria) {
return super.getAllByField("categoria", categoria);
}

@Override
public Nivel getById(int id) {
return null;
/**
* Retorna todos os niveis bloqueados de uma determinada categoria
*
* @param categoria
* @return
*/
public ArrayList<Nivel> getBloquadosByCategoria(String categoria) {
String[] fields = {"categoria", "bloqueado"};
String[] values = {categoria, "1"};
return super.getAllByFields(fields, values);

}

/**
* Insere um novo nivel na base de dados
*
* @param nivel
* @return
*/
@Override
public Nivel insertInto(Nivel nivel) {
SQLiteDatabase db = super.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(this.getField("NUMERO"), nivel.getNumero());
values.put(this.getField("CATEGORIA"), nivel.getCategoria());
values.put(this.getField("N_PERGUNTAS"), nivel.getCategoria());
values.put(this.getField("PONTUACAO_CERTA"), nivel.getPontuacaoBase());
values.put(this.getField("PONTUACAO_ERRADA"), nivel.getPontuacaoBaseErrada());
values.put(this.getField("PONTUACAO_DICA"), nivel.getPontuacaoHint());
values.put(this.getField("BLOQUEADO"), nivel.isBloqueado() ? 1 : 0);
values.put(this.getField("N_PERGUNTAS"), 0);
values.put(this.getField("N_AJUDAS"), nivel.getnAjudas());
values.put(this.getField("PONTUACAO"), 0);
values.put(this.getField("N_RESPOSTAS_CERTAS"), 0);
values.put(this.getField("N_MIN_RESPOSTAS_CERTAS"), nivel.getnMinRespostasCertas());
values.put(Nivel.NUMERO, nivel.getNumero());
values.put(Nivel.CATEGORIA, nivel.getCategoria());
values.put(Nivel.PONTUACAO_CERTA, nivel.getPontuacaoBase());
values.put(Nivel.PONTUACAO_ERRADA, nivel.getPontuacaoBaseErrada());
values.put(Nivel.PONTUACAO_DICA, nivel.getPontuacaoHint());
values.put(Nivel.BLOQUEADO, nivel.isBloqueado() ? 1 : 0);
values.put(Nivel.N_PERGUNTAS, 0);
values.put(Nivel.N_AJUDAS, nivel.getnAjudas());
values.put(Nivel.PONTUACAO, 0);
values.put(Nivel.N_RESPOSTAS_CERTAS, 0);
values.put(Nivel.N_MIN_RESPOSTAS_CERTAS, nivel.getnMinRespostasCertas());
db.insert(this.getTable(), null, values);
db.close();
return nivel;
}

@Override
public void deleteById(int id) {
String query = this.deleteByFieldQueryString("id", "" + id);
SQLiteDatabase db = super.getWritableDatabase();
db.execSQL(query);
}

public ArrayList<Nivel> getAllByCategoria(String categoria) {
return this.getAllByField("categoria", "\'" + categoria + "\'");
}

public ArrayList<Nivel> getBloquadosByCategoria(String categoria) {
String query = "SELECT * FROM categoria WHERE categoria=" + categoria + ";";
int num = 0;
ArrayList<Nivel> niveis = new ArrayList<>();
SQLiteDatabase db = super.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()) {
do {
Nivel nivel = new Nivel();
nivel.setId(cursor.getInt(0));
nivel.setNumero(cursor.getString(1));
nivel.setCategoria(cursor.getString(2));
nivel.setBloqueado(cursor.getInt(3));
nivel.setnPerguntas(cursor.getInt(4));
nivel.setPontuacaoBase(cursor.getInt(5));
nivel.setPontuacaoBaseErrada(cursor.getInt(6));
nivel.setPontuacaoHint(cursor.getInt(7));
nivel.setnRespostasCertas(cursor.getInt(8));
nivel.setnAjudas(cursor.getInt(9));
nivel.setPontuacao(cursor.getInt(10));
nivel.setnMinRespostasCertas(cursor.getInt(11));
niveis.add(nivel);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return niveis;
}

/**
* Faz update a uma pergunta por id
*
* @param nivel
* @return
*/
public Nivel updateNivel(Nivel nivel) {

@Override
public Nivel update(Nivel nivel) {
SQLiteDatabase db = super.getWritableDatabase();
String where = "id=?";
String[] whereArgs = new String[]{String.valueOf(nivel.getId())};
ContentValues values = new ContentValues();
values.put(this.getField("NUMERO"), nivel.getNumero());
values.put(this.getField("CATEGORIA"), nivel.getCategoria());
values.put(this.getField("N_PERGUNTAS"), nivel.getCategoria());
values.put(this.getField("PONTUACAO_CERTA"), nivel.getPontuacaoBase());
values.put(this.getField("PONTUACAO_ERRADA"), nivel.getPontuacaoBaseErrada());
values.put(this.getField("PONTUACAO_DICA"), nivel.getPontuacaoHint());
values.put(this.getField("BLOQUEADO"), nivel.isBloqueado() ? 1 : 0);
values.put(this.getField("N_PERGUNTAS"), nivel.getnPerguntas());
values.put(this.getField("N_AJUDAS"), nivel.getnAjudas());
values.put(this.getField("PONTUACAO"), nivel.getPontuacao());
values.put(this.getField("N_RESPOSTAS_CERTAS"), nivel.getnRespostasCertas());
values.put(this.getField("N_MIN_RESPOSTAS_CERTAS"), nivel.getnMinRespostasCertas());
values.put(Nivel.NUMERO, nivel.getNumero());
values.put(Nivel.CATEGORIA, nivel.getCategoria());
values.put(Nivel.PONTUACAO_CERTA, nivel.getPontuacaoBase());
values.put(Nivel.PONTUACAO_ERRADA, nivel.getPontuacaoBaseErrada());
values.put(Nivel.PONTUACAO_DICA, nivel.getPontuacaoHint());
values.put(Nivel.BLOQUEADO, nivel.isBloqueado() ? 1 : 0);
values.put(Nivel.N_PERGUNTAS, nivel.getnPerguntas());
values.put(Nivel.N_AJUDAS, nivel.getnAjudas());
values.put(Nivel.PONTUACAO, nivel.getPontuacao());
values.put(Nivel.N_RESPOSTAS_CERTAS, nivel.getnRespostasCertas());
values.put(Nivel.N_MIN_RESPOSTAS_CERTAS, nivel.getnMinRespostasCertas());
db.update(this.getTable(), values, where, whereArgs);
db.close();
return nivel;
}


}
@@ -8,37 +8,21 @@

import java.util.ArrayList;

import pt.ipp.estg.cmu.db.dbUtil;
import pt.ipp.estg.cmu.models.Nivel;
import pt.ipp.estg.cmu.models.Pergunta;

public class PerguntaRepo extends Repo implements RepositoryInterface<Pergunta> {
public class PerguntaRepo extends Repo<Pergunta> implements RepositoryInterface<Pergunta> {
public PerguntaRepo(Context context) {
super(context, "pergunta");
this.setFields();
}

private void setFields() {
this.addField("ID", "id");
this.addField("NIVEL", "nivel");
this.addField("IMAGEM", "imagem");
this.addField("RESPOSTA", "respostaCerta");
this.addField("RESPOSTAS_ERRADAS", "nRespostasErradas");
this.addField("ACERTOU", "acertou");
this.addField("STRING_ALEATORIA", "stringAleatoria");
this.addField("RESPOSTA_ACTUAL", "respostaActual");
this.addField("N_AJUDAS_USADAS", "nAjudasUsadas");
}

@Override
public ArrayList<Pergunta> getAll() {
return null;
super(context, Pergunta.TABLE);
}

@Override
public ArrayList<Pergunta> getAllByField(String field, String value) {
String query = this.getAllByFieldQueryString(field, value);
ArrayList<Pergunta> perguntas = new ArrayList<>();
public ArrayList<Pergunta> query(String[] tableColumns, String whereClause, String[] whereArgs, String orderBy) {
SQLiteDatabase db = super.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Cursor cursor = db.query(super.getTable(), tableColumns, whereClause, whereArgs,
null, null, orderBy);
ArrayList<Pergunta> perguntas = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
Pergunta pergunta = new Pergunta();
@@ -57,72 +41,67 @@ public ArrayList<Pergunta> getAllByField(String field, String value) {
cursor.close();
db.close();
return perguntas;

}

@Override
public Pergunta getById(int id) {
return null;
/**
* Retorta todas as perguntas de um determinado nivel
*
* @param idNivel
* @return
*/
public ArrayList<Pergunta> getAllByNivel(int idNivel) {
return super.getAllByField("nivel", "" + idNivel + "");
}


@Override
public Pergunta insertInto(Pergunta pergunta) {
SQLiteDatabase db = super.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(this.getField("NIVEL"), pergunta.getNivel());
values.put(this.getField("IMAGEM"), pergunta.getImagem());
values.put(this.getField("RESPOSTA"), pergunta.getRespostaCerta());
values.put(this.getField("RESPOSTAS_ERRADAS"), 0);
values.put(this.getField("ACERTOU"), 0);
values.put(this.getField("STRING_ALEATORIA"), pergunta.getStringAleatoria());
values.put(this.getField("RESPOSTA_ACTUAL"), pergunta.getRespostaActual());
values.put(this.getField("N_AJUDAS_USADAS"), 0);
values.put(Pergunta.NIVEL, pergunta.getNivel());
values.put(Pergunta.IMAGEM, pergunta.getImagem());
values.put(Pergunta.RESPOSTA, pergunta.getRespostaCerta());
values.put(Pergunta.RESPOSTAS_ERRADAS, 0);
values.put(Pergunta.ACERTOU, 0);
values.put(Pergunta.STRING_ALEATORIA, pergunta.getStringAleatoria());
values.put(Pergunta.RESPOSTA_ACTUAL, "");
values.put(Pergunta.N_AJUDAS_USADAS, 0);
db.insert(this.getTable(), null, values);
db.close();
return pergunta;
}

@Override
public void deleteById(int id) {
String query = this.deleteByFieldQueryString("id", "" + id);
SQLiteDatabase db = super.getWritableDatabase();
db.execSQL(query);
}

/**
* Retorta todas as perguntas de um determinado nivel
*
* @param idNivel
* @return
*/
public ArrayList<Pergunta> getAllByNivel(int idNivel) {
return this.getAllByField("nivel", "" + idNivel + "");
}

/**
* Faz update a uma pergunta por id
*
* @param pergunta
* @return
*/
public Pergunta updatePergunta(Pergunta pergunta) {
@Override
public Pergunta update(Pergunta pergunta) {
SQLiteDatabase db = super.getWritableDatabase();
String where = "id=?";
String[] whereArgs = new String[]{String.valueOf(pergunta.getId())};
ContentValues values = new ContentValues();
values.put(this.getField("NIVEL"), pergunta.getNivel());
values.put(this.getField("IMAGEM"), pergunta.getImagem());
values.put(this.getField("RESPOSTA"), pergunta.getRespostaCerta());
values.put(this.getField("RESPOSTAS_ERRADAS"), pergunta.getnRespostasErradas());
values.put(this.getField("ACERTOU"), pergunta.acertou());
values.put(this.getField("STRING_ALEATORIA"), pergunta.getStringAleatoria());
values.put(this.getField("RESPOSTA_ACTUAL"), pergunta.getRespostaActual());
values.put(this.getField("N_AJUDAS_USADAS"), pergunta.getnAjudasUsadas());
values.put(Pergunta.NIVEL, pergunta.getNivel());
values.put(Pergunta.IMAGEM, pergunta.getImagem());
values.put(Pergunta.RESPOSTA, pergunta.getRespostaCerta());
values.put(Pergunta.RESPOSTAS_ERRADAS, pergunta.getnRespostasErradas());
values.put(Pergunta.ACERTOU, pergunta.acertou());
values.put(Pergunta.STRING_ALEATORIA, pergunta.getStringAleatoria());
values.put(Pergunta.RESPOSTA_ACTUAL, pergunta.getRespostaActual());
values.put(Pergunta.N_AJUDAS_USADAS, pergunta.getnAjudasUsadas());
db.update(this.getTable(), values, where, whereArgs);
db.close();
return pergunta;
}

/**
* Retorna o numero de registos de uma query
*
* @param query
* @return
*/
public int count(String query) {
int num = 0;
SQLiteDatabase db = super.getWritableDatabase();
@@ -165,12 +144,23 @@ public int sumErradas() {
return count(query);
}


/**
* Retorna a soma de todas as respostas erradas no nivel
*
* @param nivel
* @return
*/
public int getSumNivelErradas(int nivel) {
String query = "SELECT sum(nRespostasErradas) FROM pergunta WHERE nivel =" + nivel + ";";
return count(query);
}

/**
* Retorna a soma de todas as ajudas usadas no nivel
*
* @param nivel
* @return
*/
public int getSumNivelAjudasUsadas(int nivel) {
String query = "SELECT sum(nAjudasUsadas) FROM pergunta WHERE nivel =" + nivel + ";";
return count(query);
@@ -1,52 +1,56 @@
package pt.ipp.estg.cmu.db.repositories;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.HashMap;

import pt.ipp.estg.cmu.db.DbHandler;
import pt.ipp.estg.cmu.db.Field;
import pt.ipp.estg.cmu.db.dbUtil;
import pt.ipp.estg.cmu.models.Nivel;

public class Repo<T> extends DbHandler {
public abstract class Repo<T> extends DbHandler {

private String table;
private HashMap<String, Field> fields;

public Repo(Context context, String table) {
super(context, DbHandler.DATABASE_NAME);
this.table = table;
this.fields = new HashMap<>();
}

public HashMap<String, Field> getFields() {
return fields;
}

public String getTable() {
return this.table;
}

public void addField(String key, String value) {
this.fields.put(key, new Field(value));

public ArrayList<T> query(String[] tableColumns, String whereClause, String[] whereArgs, String orderBy) {
return null;
}

public String getField(String key) {
return this.fields.get(key).getName();
public ArrayList<T> getAll() {
return this.query(null, null, null, null);
}

public String getAllQueryString() {
return "SELECT * FROM " + this.table + " ;";
public ArrayList<T> getAllByFields(String[] fields, String[] values) {
return this.query(null, dbUtil.whereClause(fields), values, null);
}

public String getByIdQueryString(int id) {
return "SELECT * FROM " + this.table + " WHERE id=" + id + ";";
public ArrayList<T> getAllByField(String field, String value) {
String[] fields = {field};
String[] values = {value};
return getAllByFields(fields, values);
}

public String getAllByFieldQueryString(String field, String value) {
return "SELECT * FROM " + this.table + " WHERE " + field + "=" + value + ";";
public T getById(int id) {
return this.getAllByField("id", "" + id).get(0);
}

public String deleteByFieldQueryString(String field, String value) {
return "DELETE FROM " + this.table + " WHERE " + field + "=" + value + ";";
public void deleteById(int id) {
String query = dbUtil.deleteByFieldQueryString(this.getTable(), "id", "" + id);
SQLiteDatabase db = super.getWritableDatabase();
db.execSQL(query);
db.close();
}
}
@@ -2,18 +2,25 @@

import java.util.ArrayList;

import pt.ipp.estg.cmu.models.Nivel;

public interface RepositoryInterface<T> {

ArrayList<T> query(String[] tableColumns, String whereClause, String[] whereArgs, String orderBy);

ArrayList<T> getAll();

ArrayList<T> getAllByFields(String[] fields, String[] values);

ArrayList<T> getAllByField(String field, String value);

T getById(int id);


T insertInto(T t);

void deleteById(int id);

T update(T resource);


}
@@ -4,14 +4,22 @@
import android.os.Parcelable;

public class Categoria implements Parcelable {

public static final String TABLE = "categoria";
public final static String ID = "id";
public final static String NOME = "nome";
public final static String ATIVA = "ativa";

private int id;
private String nome;
private boolean ativa;

public Categoria() {

}

public Categoria(String nome) {

this.nome = nome;
}

@@ -66,4 +74,5 @@ private Categoria(Parcel in) {
nome = in.readString();
ativa = in.readByte() != 0;
}

}

This file was deleted.

@@ -5,6 +5,21 @@

public class Nivel implements Parcelable {

public static final String TABLE = "nivel";

public static final String ID_NIVEL = "id";
public static final String NUMERO = "numero";
public static final String CATEGORIA = "categoria";
public static final String PONTUACAO_CERTA = "pontuacaoBase";
public static final String PONTUACAO_ERRADA = "pontuacaoBaseErrada";
public static final String PONTUACAO_DICA = "pontuacaoHint";
public static final String BLOQUEADO = "bloqueado";
public static final String N_PERGUNTAS = "nPerguntas";
public static final String N_AJUDAS = "nAjudas";
public static final String PONTUACAO = "pontuacao";
public static final String N_RESPOSTAS_CERTAS = "nRespostasCertas";
public static final String N_MIN_RESPOSTAS_CERTAS = "nMinRespostasCertas";

private int id;
private String numero;
private String categoria;
@@ -18,6 +33,9 @@ public class Nivel implements Parcelable {
private int nRespostasCertas;//numero de perguntas que o user acertou neste nivel
private int nMinRespostasCertas; //numero minimo de respostas certas para desbloquer o proximo nivel

public Nivel() {
}

public Nivel(int id, String numero, int nPerguntas, int pontuacaoBase, int pontuacaoBaseErrada, int pontuacaoHint, boolean bloqueado, String categoria, int nAjudas, int pontuacao) {
this.id = id;
this.numero = numero;
@@ -31,9 +49,6 @@ public Nivel(int id, String numero, int nPerguntas, int pontuacaoBase, int pontu
this.pontuacao = pontuacao;
}

public Nivel() {
}

public int getId() {
return id;
}
@@ -5,6 +5,18 @@

public class Pergunta implements Parcelable {

public static final String TABLE = "pergunta";

public static final String ID_PERGUNTA = "id";
public static final String NIVEL = "nivel";
public static final String IMAGEM = "imagem";
public static final String RESPOSTA = "respostaCerta";
public static final String RESPOSTAS_ERRADAS = "nRespostasErradas";
public static final String ACERTOU = "acertou";
public static final String STRING_ALEATORIA = "stringAleatoria";
public static final String RESPOSTA_ACTUAL = "respostaActual";
public static final String N_AJUDAS_USADAS = "nAjudasUsadas";

private int id;
private int nivel;
private String imagem;
@@ -15,16 +27,15 @@ public class Pergunta implements Parcelable {
private String respostaActual;
private int nAjudasUsadas;

public Pergunta() {
}

public Pergunta(int nivel, String imagem, String respostaCerta) {
this.nivel = nivel;
this.imagem = imagem;
this.respostaCerta = respostaCerta;
}

public Pergunta() {
}


/**
* Retorna o numero e ajudas usadas para esta pergunta
*
@@ -252,7 +252,7 @@ private void savePergunta() {
p.setRespostaActual("");
mRepositoryPergunta.insertInto(p);
mNivel.addnPerguntas();
mRepositoryNivel.updateNivel(mNivel);
mRepositoryNivel.update(mNivel);
} else {
p.setId(mPergunta.getId());
mImagemPathText = mImagemPathText == null ? mPergunta.getImagem() : mImagemPathText;
@@ -262,7 +262,7 @@ private void savePergunta() {
p.setNivel(mPergunta.getNivel());
p.setnAjudasUsadas(mPergunta.getnAjudasUsadas());
p.setRespostaActual(mPergunta.getRespostaActual());
mRepositoryPergunta.updatePergunta(p);
mRepositoryPergunta.update(p);
}
getActivity().getSupportFragmentManager().popBackStack(Util.STACK_ADMIN, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
@@ -154,7 +154,7 @@ private void saveNivel() {
level.setCategoria(mNivel.getCategoria());
level.setPontuacao(mNivel.getPontuacao());
level.setnRespostasCertas(mNivel.getnRespostasCertas());
mNivelRepo.updateNivel(level);
mNivelRepo.update(level);
}

getActivity().getSupportFragmentManager().popBackStack(Util.STACK_ADMIN, FragmentManager.POP_BACK_STACK_INCLUSIVE);
@@ -200,15 +200,15 @@ private void checkIfIsFinished() {
mHintButton.setVisibility(View.GONE);
mResetButton.setVisibility(View.GONE);
//save on bd
mNivelRepository.updateNivel(mNivel);
mPerguntaRepository.updatePergunta(mPergunta);
mNivelRepository.update(mNivel);
mPerguntaRepository.update(mPergunta);
unlockNextLevel();
} else {
decrementPontosNivel();
mListener.setAnswered(false);
mPergunta.addRespostasErradas();
mNivelRepository.updateNivel(mNivel);
mPerguntaRepository.updatePergunta(mPergunta);
mNivelRepository.update(mNivel);
mPerguntaRepository.update(mPergunta);
createLayout();
}
}
@@ -222,7 +222,7 @@ private void checkIfIsFinished() {
private void decrementAjuda() {
if (mNivel.getnAjudas() > 0) {
mNivel.decrementnAjudas();
mNivelRepository.updateNivel(mNivel);
mNivelRepository.update(mNivel);
mListener.setHint(mNivel.getnAjudas());
} else {
//TODO mostrar mensagem
@@ -285,7 +285,7 @@ private void unlockNextLevel() {
ArrayList<Nivel> niveisCategoria = mNivelRepository.getBloquadosByCategoria(this.mNivel.getCategoria());
Nivel aDesbloquear = niveisCategoria.get(0);
aDesbloquear.setBloqueado(false);
this.mNivelRepository.updateNivel(aDesbloquear);
this.mNivelRepository.update(aDesbloquear);
}
}