Algoritmo de sincronização no Android (SQLite para Remote Server Database)

8 respostas
S

Pessoal, estou montando uma app que vou precisar ficar sincronizando os dados do SQLite pra um banco de dados remoto, a principio será unidirecional Android atualizando banco na internet, mas queria saber a melhor maneira de fazer, a boa prática. Existe algum algoritmo de sincronização conhecido já bastante utilizado?

Pesquisando achei essas duas possibilidades:


http://symmetricds.codehaus.org/

Faz sentido elas?

Outra coisa, alguém tem algum exemplo de uma app android acessando um banco de dados remoto?

abcs

8 Respostas

S

Pessoal, pesquisando cheguei a conclusão que não tem como eu acessar um BD remotamente do android, vou precisar criar um webservice para o android conseguir acessar, então o foco da pesquisa agora muda.

Mas a outra forma que me parece viável é utilizando algumas ferramentas de sincronização de BD, que não é o que preciso no momento…

bom pra quem tiver procurando algo desse tipo fica ae os links que achei.

Outros
http://www.oracle.com/technetwork/products/database-mobile-server/overview/index.html?origref=http://stackoverflow.com/questions/4008015/android-sqlite-bidirectional-synchronization-sqlite&origref=http://www.oracle.com/technetwork/database/database-lite/overview/index.html

http://sqlite.mobigroup.ru/wiki?name=sqlite3-rdiff

http://www.ywsystems.com/?page_id=11

M

Amigo estou com o mesmo problema
poderia entrar em contato para trocarmos uma idéia?

skype marciofermino
msn [email removido]

J
package br.com.junior.clientes;

import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import br.com.junior.clientes.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

//@ Junior - Cadastro de Clientes 10/07/2012
@SuppressLint("HandlerLeak")
public class ReplicarClientes extends Activity {

	private Cursor c = null;
	private int totalDB = 0;
	private int total = 0;
	private ProgressDialog pg;
	private SQLiteDatabase db;

	JSONParser jsonParser = new JSONParser();

	// url to create new product
	private static String url_create_product = "http://teste/inserir_cliente.php";
	//http://gdias.ind.br/gdroid/home_local.php

	// JSON Node names
	private static final String TAG_SUCCESS = "success";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.replicar);

		Button btnIniciar = (Button) findViewById(R.id.btnIniciar);
		TextView txvTotal = (TextView) findViewById(R.id.txvTotal);

		db = openOrCreateDatabase("gdroid.db", Context.MODE_PRIVATE, null);

		c = db.rawQuery("SELECT * FROM clientes", null);
		totalDB = c.getCount();
		txvTotal.setText("Total Registros: " + String.valueOf(totalDB));

		if (totalDB == 0)
			btnIniciar.setEnabled(false);

		// Verifica Conex�o
		ConnectivityManager conn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		if (conn.getNetworkInfo(0).getState() == State.CONNECTED
				|| (conn.getNetworkInfo(1).getState() == State.CONNECTED))
			btnIniciar.setEnabled(true);

		else {
			btnIniciar.setEnabled(false);
			txvTotal.setText("Você precisa de conexão!");
		}

		btnIniciar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Builder msg = new Builder(ReplicarClientes.this);
				msg.setMessage("Deseja iniciar a replicação?");
				msg.setPositiveButton("SIM",
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								new CreateNewProduct().execute();
							}
						});
				msg.setNegativeButton("Não", null);
				msg.show();
			}
		});
	}

	class CreateNewProduct extends AsyncTask<String, String, String> {

		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pg = ProgressDialog.show(ReplicarClientes.this, "Cadastrando...",
					"Aguarde! Este processo pode levar alguns minutos", true,
					false, null);

		}

		protected String doInBackground(String... args) {
			while (c.moveToNext()) {

				String empresanome = c.getString(c
						.getColumnIndex("empresanome"));
				String cpf = c.getString(c.getColumnIndex("cpf"));
				String cnpj = c.getString(c.getColumnIndex("cnpj"));
				String pessoatipo = c.getString(c.getColumnIndex("pessoatipo"));
				String tipodevenda = c.getString(c
						.getColumnIndex("tipodevenda"));
				String suframa = c.getString(c.getColumnIndex("suframa"));
				String cidade = c.getString(c.getColumnIndex("cidade"));
				String bairro = c.getString(c.getColumnIndex("bairro"));
				String insest = c.getString(c.getColumnIndex("insest"));
				String fone = c.getString(c.getColumnIndex("fone"));
				String fax = c.getString(c.getColumnIndex("fax"));
				String contato = c.getString(c.getColumnIndex("contato"));
				String email = c.getString(c.getColumnIndex("email"));
				String cob_cep = c.getString(c.getColumnIndex("cob_cep"));
				String cob_cidade = c.getString(c.getColumnIndex("cob_cidade"));
				String cob_bairro = c.getString(c.getColumnIndex("cob_bairro"));
				String observacao = c.getString(c.getColumnIndex("observacao"));
				String alerta = c.getString(c.getColumnIndex("alerta"));
				String estado = c.getString(c.getColumnIndex("estado"));

				List<NameValuePair> params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair("empresanome", empresanome));
				params.add(new BasicNameValuePair("cpf", cpf));
				params.add(new BasicNameValuePair("cnpj", cnpj));
				params.add(new BasicNameValuePair("pessoatipo", pessoatipo));
				params.add(new BasicNameValuePair("tipodevenda", tipodevenda));
				params.add(new BasicNameValuePair("suframa", suframa));
				params.add(new BasicNameValuePair("cidade", cidade));
				params.add(new BasicNameValuePair("bairro", bairro));
				params.add(new BasicNameValuePair("insest", insest));
				params.add(new BasicNameValuePair("fone", fone));
				params.add(new BasicNameValuePair("fax", fax));
				params.add(new BasicNameValuePair("contato", contato));
				params.add(new BasicNameValuePair("email", email));
				params.add(new BasicNameValuePair("cob_cep", cob_cep));
				params.add(new BasicNameValuePair("cob_cidade", cob_cidade));
				params.add(new BasicNameValuePair("cob_bairro", cob_bairro));
				params.add(new BasicNameValuePair("observacao", observacao));
				params.add(new BasicNameValuePair("alerta", alerta));
				params.add(new BasicNameValuePair("estado", estado));

				// getting JSON Object
				// Note that create product url accepts POST method
				JSONObject json = jsonParser.makeHttpRequest(
						url_create_product, "POST", params);

				// check log cat fro response
				Log.d("Create Response", json.toString());
				// Transforma String em URL

				try {
					int success = json.getInt(TAG_SUCCESS);

					if (success == 1) {
						total += 1;
						db.execSQL("DELETE FROM clientes WHERE id = "
								+ c.getInt(c.getColumnIndex("id")));

						Intent i = new Intent(getApplicationContext(),
								Principal.class);
						startActivity(i);

						// closing this screen
						finish();

					}

				} catch (JSONException e) {
					e.printStackTrace();
				}

			}
			handler.sendEmptyMessage(0);
			return null;
		}

		protected void onPostExecute(String file_url) {
			// dismiss the dialog once done
			pg.dismiss();
		}

		private Handler handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				if (total == totalDB) {
					Toast.makeText(getBaseContext(),
							"Sucesso: total de " + total + "/" + totalDB,
							Toast.LENGTH_LONG).show();
				}
				finish();
			}
		};
	}
}
M

amigos na verdade eu consegui acessar um banco mysql remoto e vice versa

A

Márcio, como você fez para acessar um banco de dados remotamente e vice-versa?

A

acho que seria melhor vc fazer a sincronização de outra forma, se for só para mandar do android para algum servidor, crie um serviço no servidor que recebe JSON ou XML e envie as requisições do android, dessa forma vc pode até usar https / autenticação por exemplo

A

Preciso tirar uma foto do celular e enviar para o banco de dados do meu site.
Alguém poderia informa a melhor forma para fazer isso.

Se for possível postar o código principal do Android e do PHP eu agradeço muito.

Estou pesquisando na internet, mas não encontro nada parecido. Apenas uma aplicação que envia uma foto para um servidor Java.

A

alanl:
Preciso tirar uma foto do celular e enviar para o banco de dados do meu site.
Alguém poderia informa a melhor forma para fazer isso.

Se for possível postar o código principal do Android e do PHP eu agradeço muito.

Estou pesquisando na internet, mas não encontro nada parecido. Apenas uma aplicação que envia uma foto para um servidor Java.

aqui um exemplo: http://getablogger.blogspot.com.br/2008/01/android-how-to-post-file-to-php-server.html

Criado 30 de abril de 2012
Ultima resposta 28 de set. de 2012
Respostas 8
Participantes 5