Intereting Posts
Создавать список слоев с закругленными углами программно Не удалось найти дизайнера пользовательского интерфейса в новой Android Studio Как решить showStatusIcon на неактивном InputConnection Использование камеры в эмуляторе Android Как подключить макет с активностью Относительный гравитационный центр RelativeLayout не работает Виджет показывает «Приложение не установлено» Тост в ICS Как включить поддержку mDNS в адресной строке браузера Android Android – Thumb of fastscroll в expandablelistview не правильно прокручивает список Как хранить и извлекать изображения в базе данных Androidite SQL и отображать их на gridview Как установить идентификатор динамически созданного макета? Многофункциональное приложение, основанное на библиотеке с несколькими вкусами в Android Gradle Переключение между представлениями с кроссфейдной анимацией Как вы можете запустить изображения эмулятора VS Android? Android Gradle Как создать для Android API Google 4.2.2 не для Android 4.2.2

Вызовите базу данных Firebase из Google App Engine

Я выполнил этот учебник для настройки моего экземпляра приложения Google App Engine, и я также использую Firebase. Моя цель – поместить все «вычисления» в Google App Engine. Я хочу вызвать функцию, подобную приведенной ниже:

MyEndpoint:

package productions.widowmaker110.backend; /** An endpoint class we are exposing */ @Api( name = "myApi", version = "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() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // This method is called once with the initial value and again // whenever data at this location is updated. String value = dataSnapshot.getValue(String.class); Log.d(TAG, "Value is: " + value); } @Override 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; } } 

Основная деятельность:

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

Я понимаю, что приведенный выше код для Firebase специфичен для Android, поэтому работа в экземпляре Google App Engine не работает. Мне было интересно, знает ли кто-нибудь, как выполнять операции CRUD в базе данных firebase из бэкэнда Google App Engine. Любая помощь приветствуется.

Solutions Collecting From Web of "Вызовите базу данных Firebase из Google App Engine"

Для выполнения вызовов на стороне сервера вам необходимо использовать SDK Firebase Server. Вы можете найти информацию об установке и использовании здесь:

Добавить Firebase на ваш сервер

Установка и настройка сервера Firebase Server

При использовании Firebase с облачными конечными точками Google имейте в виду, что вам понадобятся методы Firebase в сочетании с API задач . Поскольку методы Firebase не блокируются, если вы не используете Задачи, ваша Конечная точка вернется до того, как вызов, который вы сделали в Firebase, имеет шанс вернуть его результат. Для краткого введения в использование задач ознакомьтесь с приведенной ниже ссылкой. Это разговор, поставленный в Google I / O 2016. Докладчик говорит о задачах и Firebase на Android, но концепции одинаковы при использовании Tasks и Firebase на сервере. Обратите внимание, что они включили API задач с SDK Firebase Server. Я перешел к той части разговора, которая касается непосредственно задач.

Firebase SDK для Android: глубокое погружение в технологии

Ниже приведены примеры, если вам нужно обработать результат из вашей операции чтения / записи Firebase до того, как ваша конечная точка вернет значение или если другой код зависит от результата операции чтения / записи Firebase. Это примеры на стороне сервера. Я собираюсь предположить, что вы заботитесь о том, была ли операция записи успешной. Там могут быть более эффективные способы выполнения этих операций на стороне сервера, но это то, что я сделал до сих пор.

Пример операции записи с помощью setValue ():

 DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); YourModelClass obj = new YourModelClass(); 
  1. Когда выполняется вызов метода setValue() он возвращает объект Task , сохраняя ссылку на него.

     Task<Void> setValueTask = ref.setValue(obj); 
  2. Создайте объект TaskCompletionSource . Этот объект должен быть параметризован с типом результата по вашему выбору. Я буду использовать Boolean как тип результата для этого примера.

     final TaskCompletionSource<Boolean> tcs = new TaskCompletionSource<>(); 
  3. Создайте Task из источника TaskCompletionSource которая была создана на шаге 2. Снова, сгенерированная Task должна использовать тот же тип параметра, что и объект TaskCompletionSource .

     Task<Boolean> tcsTask = tcs.getTask(); 
  4. Добавьте слушателя завершения в Task которая была сгенерирована вызовом setValue() . В слушателе завершения установите соответствующий результат в Task созданной на шаге 3. Вызов setResult() на объекте TaskCompletionSouce помечает созданную из него setResult() как завершенную. Это важно для шага 5.

     setValueTask.addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if(task.isSuccessful()){ tcs.setResult(true); }else{ tcs.setResult(false); } } }); 
  5. Вызовите Task.await() чтобы заблокировать текущий поток до тех пор, пока Task вас интересует, не завершится. Мы ожидаем, что Task сгенерированная объектом TaskCompletionSource будет отмечена как завершенная. Эта Task будет считаться полной, когда мы вызываем setResult() в источнике TaskCompletionSource используется для создания Task как это было на шаге 4. После завершения он вернет результат.

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

Вот и все, текущий поток будет блокироваться до Tasks.await() пор, пока Tasks.await() вернет значение. Вы также можете (и должны) установить значение тайм-аута в Tasks.await() если вы хотите, чтобы текущий поток блокировался неограниченно.

Если вас интересовало только то, завершилась ли Task сгенерированная setValue() и не волновала, была ли она успешной или нет, вы можете пропустить создание объекта TaskCompletionSource и просто использовать Tasks.await() непосредственно в этой Task . То же самое работает для updateChildren() . И если вам нравится, вы можете просто использовать вызовы метода для updateChilden() или setValue() которые используют DatabaseReference.CompletionListener вместе с TaskCompletionListener.

Ожидание завершения операции чтения аналогично.

Пример операции чтения с использованием addListenerForSingleValueEvent ()

 DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); YourModelClass mModelClassObject; 
  1. Создайте объект TaskCompletionSource параметризованный результатом, который вы ожидаете от Task которая будет сгенерирована из него.

     final TaskCompletionSource<YourModelClass> tcs = new TaskCompletionSource<>(); 
  2. Создание Task из объекта TaskCompletionSource

     Task<YourModelClass> tcsTask = tcs.getTask(); 
  3. Вызовите addListenerForSingleValueEvent() на нашем DatabaseReference и вызовите setResult() в Task сгенерированной на шаге 2.

     ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { YourModelClass result = dataSnapshot.getValue(YourModelClass.class); if(result != null){ tcs.setResult(result); } } @Override public void onCancelled(DatabaseError databaseError){ //handle error } }); 
  4. Вызовите Tasks.await() чтобы заблокировать текущий поток до тех пор, пока Task вас интересует, не завершится. Task будет считаться полной, когда мы будем называть setResult() как это было на шаге 3, и вернем результат.

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

Как упоминалось выше, вы можете использовать метод Tasks.await() вместе со значением тайм-аута, чтобы предотвратить блокировку текущего потока на неопределенный срок.

Как и в головах, я обнаружил, что Firebase не убивает фоновый поток, который используется для его операций. Это означает, что экземпляр GAE никогда не работает. Посмотрите эту тему для получения дополнительной информации:

Firebase, Background Threads и App Engine