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

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

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

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

skype marciofermino
msn marciofermino2003@hotmail.com

[code]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();
		}
	};
}

}[/code]

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

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

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

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.

[quote=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.[/quote]

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