>
Boa Noite!
Meu programa está funcionando como mostrado nas aulas. A única coisa que não está funcionando é o db.delete no ExportarVendasService.
Até ia deixar passar, uma vez que está replicando normal, porém na aula seguinte precisei do valor da variável totalReplicado, e como deu erro nessa parte, ele sempre retorna o valor 0. Por isso, mesmo o sistema replicando todas as vendas, aparece a msg de notificação de que não houve sucesso, mesmo tendo realizado a tarefa. Copiei o código dos arquivos disponibilizados e mesmo assim deu erro. Gostaria de alguma ajuda nesse sentindo. Obrigado
Segue meu código:
ExportarVendasService
package br.com.freeraw.vendas;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
//Classe ExportarVendasService herdando de Service e implementando com Runnable
public class ExportarVendasService extends Service implements Runnable {
public void onCreate() {
new Thread(ExportarVendasService.this).start();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void run() {
//Abrindo conexão com o BD
SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);
//Setando o cursor para pesquisar as vendas
Cursor cursor = db.rawQuery("SELECT * FROM vendas", null);
int totalDB = cursor.getCount(); //Contando quantas vendas no BD
int totalReplicado = 0; //Iniciando o totalReplicado em 0
//Fazendo que a aplicação sempre mova para o seguinte ao terminar a anterior, enquanto houver
while(cursor.moveToNext()){
StringBuilder strURL = new StringBuilder();
strURL.append("http://freeraw.com.br/admin/android/inserir.php?produto=");
strURL.append(cursor.getInt(cursor.getColumnIndex("produto")));
strURL.append("&preco=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("preco")));
strURL.append("&latitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("la")));
strURL.append("&longitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("lo")));
Log.d("ExportarVendasService", strURL.toString()); //Exibindo um log no LogCat para saber se o endereço está correto
//Recuperando a resposta da página http com Y ou N
try{
URL url = new URL(strURL.toString());
HttpURLConnection http = (HttpURLConnection) url.openConnection();
InputStreamReader ips = new InputStreamReader(http.getInputStream());
BufferedReader line = new BufferedReader(ips);
//Lendo a linha resposta
String linhaRetorno = line.readLine();
//Se retornar Y, deleta do banco a venda e acrescenta +1 a variável totalReplicado
if(linhaRetorno.equals("Y")){
db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado++;
}
} catch(Exception ex){
Log.d("ExportarVendasService", ex.getMessage());
}
}
//Exibir notificação ao terminar
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification nt = null;
//Condição se O total de vendas no banco é igual ao total replicado
if(totalDB == totalReplicado) {
//Criando a notificação e a flags se for sucesso
nt = new Notification(R.drawable.ic_launcher, "Status da Replicação", System.currentTimeMillis());
nt.flags |= Notification.FLAG_AUTO_CANCEL;
PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);
nt.setLatestEventInfo(this, "Status da Replicação", "A replicação foi feita com sucesso. Total de " + totalReplicado, p);
} else {
//Criando a notificação e a flags se não for sucesso
nt = new Notification(R.drawable.ic_launcher, "Status da Replicação", System.currentTimeMillis());
nt.flags |= Notification.FLAG_AUTO_CANCEL;
PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);
nt.setLatestEventInfo(this, "Status da Replicação", "A replicação não teve sucesso. Feito " + totalReplicado + " de " + totalDB, p);
}
//Definindo que o aparelho vibre duas vezes
nt.vibrate = new long[]{100, 2000, 1000, 2000}; // Pausa de 100 (1/10 de seg), vibra por 2000 (2seg), Pausa de 1000 (1seg), vibra por 2000 (2seg)
notificationManager.notify((int)Math.round(Math.random()), nt); //arredondando o valor randomico para ser inteiro
db.close(); //Fechando o BD
}
}
mysql_connect("dbmy0056.whservidor.com", "freeraw_2", "******");
mysql_select_db("freeraw_2");
$sql = "INSERT INTO vendas (produto, preco, latitude, longitude)
VALUES ('".$_GET["produto"]."','".$_GET["preco"]."','".$_GET["latitude"]."','".$_GET["longitude"]."')";
mysql_query($sql);
if(mysql_affected_rows() > 0){
echo "Y";
} else {
echo "N";
}
?>
Ola Richeles
vc pode dar um logcat la no totalDB p ver se ele esta pegando o valor certo q ta la no seu banco....
Olá André!
Está sim. Quando eu faço a notificação, ele diz que não fez a replicação, tendo feito 0 de 9 registros. E eu tenho 9 vendas cadastradas no celular.
E as 9 vendas aparecem no meu BD online.
Se mesmo assim precisar do logcat eu faço
Obrigado pela prontidão!
opa Richelle
entao veja se esta entrando nesta linha
if(linhaRetorno.equals("Y")){
db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado ;
}
coloque um logcat em totalReplicado.......
Bom dia André!
Coloquei e realmente não está entrando no db.delete. Segue a imagem do logCat:
09-29 11:11:39.168: D/libEGL(29276): loaded /system/lib/egl/libEGL_mali.so
09-29 11:11:39.173: D/libEGL(29276): loaded /system/lib/egl/libGLESv1_CM_mali.so
09-29 11:11:39.178: D/libEGL(29276): loaded /system/lib/egl/libGLESv2_mali.so
09-29 11:11:39.183: E/(29276): Device driver API match
09-29 11:11:39.183: E/(29276): Device driver API version: 23
09-29 11:11:39.183: E/(29276): User space API version: 23
09-29 11:11:39.183: E/(29276): mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Wed Oct 9 21:05:57 KST 2013
09-29 11:11:39.268: D/OpenGLRenderer(29276): Enabling debug mode 0
09-29 11:11:39.308: I/ActivityManager(29276): Timeline: Activity_idle id: android.os.BinderProxy@421afd08 time:195172936
09-29 11:11:44.548: I/ActivityManager(29276): Timeline: Activity_idle id: android.os.BinderProxy@421afd08 time:195178175
09-29 11:11:49.103: I/ActivityManager(29276): Timeline: Activity_launch_request id:br.com.freeraw.vendas time:195182728
09-29 11:11:49.493: I/ActivityManager(29276): Timeline: Activity_idle id: android.os.BinderProxy@42243a80 time:195183120
09-29 11:11:51.983: I/ActivityManager(29276): Timeline: Activity_idle id: android.os.BinderProxy@421afd08 time:195185610
09-29 11:11:53.653: W/ContextImpl(29276): Implicit intents with startService are not safe: Intent { act=freeraw.iniciar_servico } android.content.ContextWrapper.startService:494 br.com.freeraw.vendas.MainActivity.Replicacao_Click:73 java.lang.reflect.Method.invokeNative:-2
09-29 11:11:53.668: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.378: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=1&preco=2.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.493: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=22&preco=6.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.603: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=2&preco=6.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.718: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=1&preco=2.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.838: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:54.958: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:55.088: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=2&preco=6.0&latitude=-23.542639920712872&longitude=-46.3972257704803
09-29 11:11:55.213: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.54237383051967&longitude=-46.39690651402686
09-29 11:11:55.338: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.54237383051967&longitude=-46.39690651402686
09-29 11:11:55.463: D/ExportarVendasService(29276): http://freeraw.com.br/admin/android/inserir.php?produto=21&preco=2.0&latitude=-23.54237383051967&longitude=-46.39690651402686
vc esta rodando em um celular ou no emulador???
Estou usando meu celular. Um galaxy S3 com android 4.4.2.
Todo o programa está funcionando. Terminei até a aula e todos os passos dos sistema funcionou como ensinado. Só o deletar que não está indo mesmo.
então faça o seguinte
rode no seu emulador p ver se vai funcionar
pq se funcionar o problema esta no seu celular ...
Rodei em vários emuladores diferentes, com várias versões diferentes e dão o mesmo resultado do celular: Diz que não houve exito, mas replicou as vendas normalmente, porém sem deletar nada
Fiz outro teste aqui e descobri que o linhaRetorno está retornando o valor normal de Y. O problema está no tratamento de if linhaRetorno ser igual a Y.
Segue meu novo logCat
09-29 20:22:56.276: D/libEGL(3221): loaded /system/lib/egl/libEGL_genymotion.so
09-29 20:22:56.280: D/(3221): HostConnection::get() New Host Connection established 0xb831f7b0, tid 3221
09-29 20:22:56.288: D/libEGL(3221): loaded /system/lib/egl/libGLESv1_CM_genymotion.so
09-29 20:22:56.288: D/libEGL(3221): loaded /system/lib/egl/libGLESv2_genymotion.so
09-29 20:22:56.344: W/EGL_genymotion(3221): eglSurfaceAttrib not implemented
09-29 20:22:56.344: E/OpenGLRenderer(3221): Getting MAX_TEXTURE_SIZE from GradienCache
09-29 20:22:56.352: E/OpenGLRenderer(3221): Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
09-29 20:22:56.352: D/OpenGLRenderer(3221): Enabling debug mode 0
09-29 20:23:02.216: D/ExportarVendasService(3221): http://freeraw.com.br/admin/android/inserir.php?produto=0&preco=2.5&latitude=30.5999999&longitude=30.5999999
09-29 20:23:02.476: D/ExportarVendasService(3221): %uFEFFY
09-29 20:23:02.476: D/ExportarVendasService(3221): http://freeraw.com.br/admin/android/inserir.php?produto=0&preco=2.5&latitude=30.5999999&longitude=30.5999999
09-29 20:23:02.620: D/ExportarVendasService(3221): %uFEFFY
09-29 20:23:02.620: D/ExportarVendasService(3221): http://freeraw.com.br/admin/android/inserir.php?produto=0&preco=2.5&latitude=30.5999999&longitude=30.5999999
09-29 20:23:02.780: D/dalvikvm(3221): GC_FOR_ALLOC freed 138K, 7% free 2841K/3028K, paused 10ms, total 10ms
09-29 20:23:02.780: D/ExportarVendasService(3221): %uFEFFY
09-29 20:23:02.780: D/ExportarVendasService(3221): http://freeraw.com.br/admin/android/inserir.php?produto=0&preco=2.5&latitude=30.5999999&longitude=30.5999999
09-29 20:23:02.924: D/ExportarVendasService(3221): %uFEFFY
E a parte do código que remete a essa parte:
public void run() {
//Abrindo conexão com o BD
SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);
//Setando o cursor para pesquisar as vendas
Cursor cursor = db.rawQuery("SELECT * FROM vendas", null);
int totalDB = cursor.getCount(); //Contando quantas vendas no BD
int totalReplicado = 0; //Iniciando o totalReplicado em 0
//Fazendo que a aplicação sempre mova para o seguinte ao terminar a anterior, enquanto houver
while(cursor.moveToNext()){
StringBuilder strURL = new StringBuilder();
strURL.append("http://freeraw.com.br/admin/android/inserir.php?produto=");
strURL.append(cursor.getInt(cursor.getColumnIndex("produto")));
strURL.append("&preco=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("preco")));
strURL.append("&latitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("la")));
strURL.append("&longitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("lo")));
Log.d("ExportarVendasService", strURL.toString()); //Exibindo um log no LogCat para saber se o endereço está correto
//Recuperando a resposta da página http com Y ou N
try{
URL url = new URL(strURL.toString());
HttpURLConnection http = (HttpURLConnection) url.openConnection();
InputStreamReader ips = new InputStreamReader(http.getInputStream());
BufferedReader line = new BufferedReader(ips);
//Lendo a linha resposta
String linhaRetorno = line.readLine();
Log.d("ExportarVendasService", linhaRetorno.toString());
//Se retornar Y, deleta do banco a venda e acrescenta 1 a variável totalReplicado
if(linhaRetorno.equals("Y")){
db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado ;
Log.d("ExportarVendasService", "OK");
}
} catch(Exception ex){
Log.d("ExportarVendasService", ex.getMessage());
}
}
Bem, depois de muito bater a cabeça e fazer muitos teste acho que descobri o que está causando o erro.
O problema não está no if. Mas está na codificação da palavra que pego na página com o comando InputStreamReader.
Em vez de retornar Y quando eh feita a conversão dos bytes, ele está retornando o Y com um sinal de mais dentro do caractere conforme imagem a baixo. Agora a pergunta é: Como eu faço pra resolver isso? Já mudei as configuração de codificação do eclipse e nada. Preciso dessa ajuda pra seguir em frente em colocar em prática o que aprendi. Obrigado
Olá
Para evitar problemas, use 0 e 1.
Ou seja, ao invez de Y, use 1.
Faça o PHP retornar 1 e depois compare!
Deu o mesmo problema! Agora ele retorna na linhaRetorno outro caractere que nem chega perto de 1, apesar do php retornar certo!
Segue a imagem:
opa Richelle,
vc verificou se esta aparecendo o Y la no seu browser??
Sim. Qualquer letra que coloco o browser retorna o valor que pedi. O problema está na forma como está sendo tratada a resposta
Olá
Seu PHP ta retornando sempre duas linhas
Veja (cole o link abaixo no Chrome, em outro navegador não irá funcionar)
view-source:http://freeraw.com.br/admin/android/inserir.php?produto=
De alguma forma seu arquivo PHP está retornando esse espaço em branco (veja e altere), ou utilize o padrão JSON (seria mais complicado adpatar, no fórum, tem exemplos).
Abraços
Excelente observação! Muito mesmo! Bati a cabeça e realizei muitos testes, mas sem sucesso.
Como fiz o meu arquivo php pelo Dreamweaver como de costume, decidi copiar o código dentro de um arquivo de bloco de notas crú, e ao
subir o arquivo, a replicação apareceu como sendo realizada com sucesso e o delete.db foi realizado. Agradeço a paciência e a ajuda! Valeu