사용자 정보 요청 및 저장

<kakaoRegisterRequest.java>

import android.os.Bundle;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;

public class KakaoRegisterRequest extends StringRequest {

final static private String url = "https://education-essential.firebaseio.com/";
private Map<String, String> properties;

public KakaoRegisterRequest(String nickname, Response.Listener<String> listener) {
    super(Method.POST, url, listener, null);
    properties = new HashMap<>();

    properties.put("nickname", "Leo");
}

public Map<String, String> getProperties() {
    return properties;
}

}

미리 지정된 양식 사용은 4개의 띄어쓰기로 들여쓰세요.-----------------------------------

<SampleSignupActivity.java>

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.crashlytics.android.Crashlytics;
import com.kakao.auth.ApiResponseCallback;
import com.kakao.network.ErrorResult;
import com.kakao.usermgmt.ApiErrorCode;
import com.kakao.usermgmt.UserManagement;
import com.kakao.usermgmt.callback.MeV2ResponseCallback;
import com.kakao.usermgmt.response.MeV2Response;
import com.kakao.util.OptionalBoolean;
import java.util.Map;
import io.fabric.sdk.android.Fabric;

/**

  • 유효한 세션이 있다는 검증 후
  • me를 호출하여 가입 여부에 따라 가입 페이지를 그리던지 Main 페이지로 이동 시킨다.
    */

public class SampleSignupActivity extends BaseActivity {

/**
 * Main으로 넘길지 가입 페이지를 그릴지 판단하기 위해 me를 호출한다.
 * @param @savedInstanceState 기존 session 정보가 저장된 객체
 */

protected void showWaitingDialog() {
    WaitingDialog.showWaitingDialog(this);
}
protected void cancelWaitingDialog() {
    WaitingDialog.cancelWaitingDialog();
}

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Fabric.with(this, new Crashlytics());
    requestMe();

    // TODO: Move this to where you establish a user session
    logUser();

}

private void logUser() {
    // TODO: Use the current user's information
    // You can call any combination of these three methods
    Crashlytics.setUserIdentifier("1004");
    Crashlytics.setUserEmail("user@fabric.io");
    Crashlytics.setUserName("카카오 관리자");
}

protected void showSignup() {
    setContentView(R.layout.layout_usermgmt_signup);
    final ExtraUserPropertyLayout extraUserPropertyLayout = findViewById(R.id.extra_user_property);
    Button signupButton = findViewById(R.id.buttonSignup);
    signupButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            requestSignUp( extraUserPropertyLayout.getProperties());
        }
    });
}


private void requestSignUp(final Map<String, String> properties) {
    UserManagement.getInstance().requestSignup(new ApiResponseCallback<Long>() {
        @Override
        public void onNotSignedUp() {
        }

        @Override
        public void onSuccess(Long result) {
           // 여기에 추가
            getInfo();
            requestMe();
        }

        @Override
        public void onFailure(ErrorResult errorResult) {
            final String message = "UsermgmtResponseCallback : failure : " + errorResult;
            com.kakao.util.helper.log.Logger.w(message);
            KakaoToast.makeToast(getApplicationContext(), message, Toast.LENGTH_LONG).show();
            finish();
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
        }
    }, properties);
}

/**
 * 사용자의 상태를 알아 보기 위해 me API 호출을 한다.
 */
protected void requestMe() {

    UserManagement.getInstance().me(new MeV2ResponseCallback() {
        @Override
        public void onFailure(ErrorResult errorResult) {
            String message = "failed to get user info. msg=" + errorResult;
            Logger.d(message);

            int result = errorResult.getErrorCode();
            if (result == ApiErrorCode.CLIENT_ERROR_CODE) {
                KakaoToast.makeToast(getApplicationContext(), getString(R.string.error_message_for_service_unavailable), Toast.LENGTH_SHORT).show();
                finish();
            } else {
                redirectLoginActivity();
            }
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
            Logger.e("onSessionClosed");
            redirectLoginActivity();
        }

        @Override
        public void onSuccess(MeV2Response result) {
            if (result.hasSignedUp() == OptionalBoolean.FALSE) {
                getInfo();
                showSignup();
            }

            else {

                redirectMainActivity();
            }
        }

        @Override
        public void onDidStart() {
            showWaitingDialog();
        }

        @Override
        public void onDidEnd() {
            cancelWaitingDialog();
        }
    });
}

private void getInfo() {
    Intent getintent = new Intent(this, KakaoRegisterRequest.class);
    startActivity(getintent);
}

private void redirectMainActivity() {
    Intent i = new Intent(this, MainActivity.class);
    startActivity(i);
}

}


사용자의 정보 요청 및 저장은 firebase(데이터베이스에) 적용하는 방법이 안 나와 있습니다.
아래 예제 있는 대로 구현을 하였고, 이 과정에서 데이터베이스에 잡히지 않는 점이 발생하고 있습니다.
앱은 정상적으로 작동되고 있구요…

어떻게 받아야 하는지

2018-12-02 23:27:54.578 24005-1759/? E/SQLiteDatabase: Error inserting period=2000 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService required_network_type=0 runtime=1543760874510 source=4 target_package=com.google.android.gms source_version=14574000 last_runtime=0 user_id=0 job_id=-1 requires_charging=0 tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG flex_time=0 task_type=0 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}}
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067)
#################################################################
Error Code : 2067 (SQLITE_CONSTRAINT_UNIQUE)
Caused By : Abort due to constraint violation.
	(UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067))

안녕하세요 로그상에서 보면 에러 코ㅗ드가 반환되었습니다. ㅠㅠ

에러 메시지로 봤을 때는 뭔가 동일한 record를 집어넣으려고 하시는 것 같은데요. 같은 유저를 두번 저장하려고 할 때 문제가 생기는 것 같기 때문에 이 부분을 먼저 조회한 후 다르게 처리하셔야할 것 같습니다.