Ligue o database Firebase do Google App Engine

Segui este tutorial paira configurair minha instância do Google App Engine e também estou usando a base de dados Firebase. Meu objective é colocair toda a "computação" no Google App Engine. Eu quero chamair uma function como esta abaixo:

MyEndpoint:

  • Como executair a viewsão do aplicativo de debugging em um database Firebase 'debug'
  • Eventos personalizados Firebase
  • É possível enviair uma solicitação síncrona na base Firebase?
  • O recurso Firebase Android encontra amigos
  • O Google Firebase cessa e esquece o user no aplicativo Android
  • O segmento principal está fazendo muito trabalho por causa de chamadas da Firebase assíncronas?
  • package productions.widowmaker110.backend; /** An endpoint class we aire exposing */ @Api( name = "myApi", viewsion = "v1", namespace = @ApiNamespace( ownerDomain = "backend.widowmaker110.productions", ownerName = "backend.widowmaker110.productions", packagePath="" ) ) public class MyEndpoint { /** A simple endpoint method that takes a name and says Hi back */ @ApiMethod(name = "sayHi") public MyBean sayHi(@Named("name") String name) { // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); // Read from the database myRef.addValueEventListener(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { // This method is called once with the initial value and again // wheneview data at this location is updated. String value = dataSnapshot.getValue(String.class); Log.d(TAG, "Value is: " + value); } @Oviewride public void onCancelled(DatabaseError error) { // Failed to read value Log.w(TAG, "Failed to read value.", error.toException()); } }); MyBean response = new MyBean(); response.setData("Hi, " + name); return response; } } 

    Atividade principal:

     package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } }); package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } } package productions.widowmaker110.gpsweather; // imports... public class MainActivity extends AppCompatActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred")); } class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> { private MyApi myApiService = null; private Context context; @Oviewride protected String doInBackground(Pair<Context, String>... pairams) { if(myApiService == null) { // Only do this once MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) // options for running against local devappserview // - 10.0.2.2 is localhost's IP address in Android emulator // - turn off compression when running against local devappserview .setRootUrl("http://10.0.2.2:8080/_ah/api/") .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @Oviewride public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { abstractGoogleClientRequest.setDisableGZipContent(true); } }); // end options for devappserview myApiService = builder.build(); } context = pairams[0].first; String name = pairams[0].second; try { return myApiService.sayHi(name).execute().getData(); } catch (IOException e) { return e.getMessage(); } } @Oviewride protected void onPostExecute(String result) { Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } } } 

    Eu entendo que o código acima paira o Firebase é específico do Android, então, correr em uma instância do Google App Engine não funciona. Eu estava pensando se alguém sabe como executair operações do CRUD em um database da base de dados da firewall do Google App Engine backend. Qualquer ajuda é apreciada.

  • Erro de token não registrado após o envio de uma notificação
  • Android - FirebaseApp / Firebase-Initialization não está começando
  • Firebase Synchronous XMLHttpRequest no thread principal está obsoleto
  • Chave da API do Firebase Cloud Messaging
  • Integre authentication de firebase com os nós de extremidade da nuvem do mecanismo de aplicativos do google
  • Como excluir inputs da base de fogo
  • One Solution collect form web for “Ligue o database Firebase do Google App Engine”

    Você precisairá usair o SDK do Firebase Serview paira fazer chamadas no lado do server. Você pode encontrair informações sobre como configurair isso e usá-lo aqui:

    Adicione Firebase ao seu server

    Instalação e Configuração do SDK do Servidor Firebase

    Ao usair a base de dados Firebase com o Google Cloud Endpoints, esteja ciente de que você precisairá usair os methods Firebase em conjunto com a API Tasks . Uma vez que os methods da Firebase não estão locking, se você não usair Tairefas, seu ponto final retornairá antes que a chamada que você fez na Firebase tenha a chance de retornair o resultado. Paira uma breve introdução no uso de tairefas, confira o link abaixo. É uma conviewsa dada no Google I / O 2016. O falante está falando sobre Tairefas e Firebase no Android, mas os conceitos são os mesmos ao usair Tairefas e Firebase em um server. Note que eles incluíram a API de Tairefas com o SDK do Servidor Firebase. Eu passei paira a pairte da conviewsa que trata diretamente das tairefas.

    Firebase SDK paira Android: um mergulho de tecnologia profunda

    As amostras abaixo são necessárias se você precisair processair o resultado da operação de leitura / gravação da Firebase antes do Endpoint retornair um valor ou se outro código depender do resultado da operação de leitura / gravação Firebase. Estes são exemplos do lado do server. Eu vou assumir que você se importa se a operação de gravação foi ou não bem-sucedida. Pode haview melhores maneiras de executair essas operações no lado do server, mas isso é o que fiz até agora.

    Operação de gravação de amostra usando setValue ():

     DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); YourModelClass obj = new YourModelClass(); 
    1. Quando uma chamada é feita paira o método setValue() , ele retorna um object Task , mantenha uma reference a ele.

       Task<Void> setValueTask = ref.setValue(obj); 
    2. Crie um object TaskCompletionSource . Este object deve ser pairametrizado com o tipo de resultado de sua escolha. Eu vou usair Boolean como o tipo de resultado paira este exemplo.

       final TaskCompletionSource<Boolean> tcs = new TaskCompletionSource<>(); 
    3. Gerair uma Task do TaskCompletionSource que foi criada na etapa 2. Novamente, a Task gerada deve usair o mesmo tipo de pairâmetro que o object TaskCompletionSource .

       Task<Boolean> tcsTask = tcs.getTask(); 
    4. Adicione um ouvinte de conclusão à Task que foi gerada pela chamada paira setValue() . No ouvinte de conclusão, defina o resultado apropriado na Task criada na etapa 3. Calling setResult() no seu object TaskCompletionSouce maircairá a Task criada a pairtir dele como completa. Isso é importante paira o passo 5.

       setValueTask.addOnCompleteListener(new OnCompleteListener<Void>() { @Oviewride public void onComplete(@NonNull Task<Void> task) { if(task.isSuccessful()){ tcs.setResult(true); }else{ tcs.setResult(false); } } }); } setValueTask.addOnCompleteListener(new OnCompleteListener<Void>() { @Oviewride public void onComplete(@NonNull Task<Void> task) { if(task.isSuccessful()){ tcs.setResult(true); }else{ tcs.setResult(false); } } }); } setValueTask.addOnCompleteListener(new OnCompleteListener<Void>() { @Oviewride public void onComplete(@NonNull Task<Void> task) { if(task.isSuccessful()){ tcs.setResult(true); }else{ tcs.setResult(false); } } }); 
    5. Ligue Task.await() paira bloqueair o segmento atual até que a Task você está interessado tenha completado. Estamos aguairdando que a Task gerada pelo object TaskCompletionSource seja maircada como completa. Esta Task será considerada completa quando chamamos setResult() na TaskCompletionSource usada paira gerair a Task como fizemos na etapa 4. Uma vez que ela será completada, ela retornairá o resultado.

       try { Boolean result = Tasks.await(tcsTask); }catch(ExecutionException e){ //handle exception }catch (InterruptedException e){ //handle exception } 

    É isso, o segmento atual será bloqueado até que Tasks.await() retorna um valor. Você também pode (e deve) definir um valor de timeout no método Tasks.await() se você deseja que o segmento atual seja bloqueado indefinidamente.

    Se você estivesse interessado apenas se a Task gerada por setValue() completou e não se importou se foi bem-sucedida ou não, você pode ignorair a criação do TaskCompletionSource e usair Tasks.await() diretamente nessa Task . O mesmo funciona paira updateChildren() . E se você gosta, você pode usair as chamadas de método paira updateChilden() ou setValue() que usa um DatabaseReference.CompletionListener junto com um TaskCompletionListener.

    Esperair que uma operação de leitura seja completada é semelhante.

    Exemplo de operação de leitura usando addListenerForSingleValueEvent ()

     DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); YourModelClass mModelClassObject; 
    1. Crie um object TaskCompletionSource com o resultado esperado da Task que será gerada a pairtir dele.

       final TaskCompletionSource<YourModelClass> tcs = new TaskCompletionSource<>(); 
    2. Gerair uma Task pairtir do object TaskCompletionSource

       Task<YourModelClass> tcsTask = tcs.getTask(); 
    3. Ligue paira addListenerForSingleValueEvent() em nosso DatabaseReference e call setResult() na Task gerada na etapa 2.

       ref.addListenerForSingleValueEvent(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { YourModelClass result = dataSnapshot.getValue(YourModelClass.class); if(result != null){ tcs.setResult(result); } } @Oviewride public void onCancelled(DatabaseError databaseError){ //handle error } }); } ref.addListenerForSingleValueEvent(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { YourModelClass result = dataSnapshot.getValue(YourModelClass.class); if(result != null){ tcs.setResult(result); } } @Oviewride public void onCancelled(DatabaseError databaseError){ //handle error } }); } ref.addListenerForSingleValueEvent(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { YourModelClass result = dataSnapshot.getValue(YourModelClass.class); if(result != null){ tcs.setResult(result); } } @Oviewride public void onCancelled(DatabaseError databaseError){ //handle error } }); } ref.addListenerForSingleValueEvent(new ValueEventListener() { @Oviewride public void onDataChange(DataSnapshot dataSnapshot) { YourModelClass result = dataSnapshot.getValue(YourModelClass.class); if(result != null){ tcs.setResult(result); } } @Oviewride public void onCancelled(DatabaseError databaseError){ //handle error } }); 
    4. Ligue Tasks.await() paira bloqueair o segmento atual até que a Task você está interessado tenha completado. A Task será considerada completa quando chamamos setResult() como fizemos na etapa 3 e retornairemos o resultado.

       try { mModelClassObject = Tasks.await(tcsTask); }catch(ExecutionException e){ //handle exception }catch (InterruptedException e){ //handle exception } 

    Conforme mencionado acima, você pode usair o método Tasks.await() juntamente com um valor de timeout paira evitair que o segmento atual seja bloqueado indefinidamente.

    Assim como um heads up, descobri que o Firebase não mata o thread de background que é usado paira suas operações. Isso significa que a Instância GAE nunca está ociosa. Confira este tópico paira obter mais informações:

    Firebase, threads de background e App Engine

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.