- Analytics for beginners
- Migrate from UA to GA4
- Manage accounts, properties, and users
- Manage data
- Understand reports
- Google Ads and attribution
- Audiences and remarketing
- Integrations
Pelajari cara mengupload file, menghapus file, dan memeriksa status data yang diupload.
Permintaan ke Analytics Management API menggunakan metode uploadData
mungkin gagal dengan pesan error "Nama header kolom tidak valid --------------------------" jika Anda tidak memberikan parameter kueri yang diperlukan, uploadType
.
Halaman Kelola Upload
adalah tempat Anda mengupload data baru ke Analytics. Setiap Kumpulan Data memiliki halaman Kelola Upload sendiri. Halaman ini menampilkan status file yang telah diupload oleh Anda atau orang lain untuk Set Data tersebut. Anda juga dapat menghapus data yang diupload menggunakan halaman ini.
Anda harus memiliki peran Editor di tingkat properti untuk mengupload data
atau menghapus file yang diupload. Anda dapat melihat file data yang diupload jika memiliki peran Pembaca.
Anda tidak dapat menghapus atau mengubah data pengembalian dana setelah data tersebut diupload ke akun Analytics Anda.
Dalam artikel ini:
- Menampilkan halaman Kelola Upload
- Mengupload Data
- Waktu dan status pemrosesan
- Upload yang gagal dan error upload
- Menghapus data yang diupload
- Referensi terkait
Menampilkan halaman Kelola Upload
- Login ke Google Analytics.
- Klik
Admin, dan buka properti yang berisi Set Data yang ingin dikelola.
- Pada kolom PROPERTI, klik Impor Data. Ini akan menampilkan tabel Kumpulan Data.
- Cari Set Data yang ingin Anda kelola.
- Klik link
Kelola Upload di sebelah kanan Set Data. Tindakan ini akan menampilkan halaman Kelola Upload.
Halaman Kelola Upload
Mengupload Data
Untuk mengupload data baru ke Analytics:
- Tampilkan halaman Kelola Upload untuk Set Data yang akan menerima data.
- Klik tombol Upload file.
- Pilih file yang ingin Anda upload kemudian klik Upload.
Waktu dan status pemrosesan
Data yang diupload harus diproses sebelum dapat muncul di laporan. Artinya, dapat dibutuhkan waktu
hingga 24 jam sebelum data mulai muncul dalam laporan Anda.
Status pemrosesan setiap file yang diupload ditampilkan di halaman Kelola Upload.
Status Upload File
Status | Deskripsi |
---|
Tertunda
| File telah berhasil diupload dan sedang menunggu pemrosesan.
|
Selesai
| File berhasil diproses. Setelah pemrosesan selesai, butuh waktu hingga 24 jam sebelum data tersedia dalam laporan.
|
Gagal
| Terjadi error pemrosesan. Lihat bagian Upload yang Gagal dan Error Upload di bawah ini.
|
Untuk mengetahui apakah status file telah berubah, klik tombol Refresh di bagian atas halaman Kelola Upload.
Upload yang gagal dan error upload
Jika ditemukan error dalam file yang diupload, tidak satu pun data dalam file tersebut akan diproses, dan status yang ditampilkan di halaman Kelola Upload adalah "Gagal". Klik link Lihat error untuk melihat pesan error
tertentu. Pelajari lebih lanjut cara menangani error upload.
Menghapus data yang diupload
Untuk menghapus file yang diupload dari Set Data, buka halaman Kelola Upload untuk Set Data. Pilih file yang akan dihapus dan klik tombol Hapus yang dipilih.
Pengaruh penghapusan
Menghapus file data yang diupload akan mencegah data tersebut agar
tidak digabungkan ke hit mendatang. Namun, hit yang telah digabungkan dengan data yang diupload tidak akan terpengaruh. Dengan kata lain, laporan yang berjalan setelah file dihapus tidak akan menampilkan data yang diupload, namun laporan historis (dari tanggal sebelum penghapusan) tetap akan menampilkan data.
Membatalkan tautan tampilan
Agar aktif, Set Data harus dimiliki setidaknya satu tampilan. Jadi, menghapus semua tampilan dari Set Data akan mengakibatkan Set Data tidak aktif.
Jika Anda menambahkan tampilan ke Set Data yang ada, data untuk tampilan tersebut akan mulai digabungkan pada tanggal tampilan ditambahkan (namun tergantung pada prinsip mode Set Data).
- Jenis data yang dapat Anda impor
- Mengonfigurasi Impor Data
- Batas Impor Data & topik lanjutan
- Contoh Impor Data
Apakah ini membantu?
Bagaimana cara meningkatkannya?
Libary Paging melacak status permintaan pemuatan untuk data yang di-page dan menampilkannya melalui class LoadState
. Aplikasi Anda dapat mendaftarkan pemroses dengan PagingDataAdapter
untuk menerima informasi tentang status saat ini dan mengupdate UI sebagaimana mestinya.
Status ini disediakan dari adaptor karena status tersebut sinkron dengan UI. Ini berarti bahwa pemroses Anda menerima update saat pemuatan halaman telah diterapkan ke UI.
Sinyal LoadState
terpisah diberikan untuk setiapLoadType
dan jenis sumber data (PagingSource
atau
RemoteMediator
). Objek CombinedLoadStates
yang diberikan oleh pemroses berisi informasi tentang status pemuatan dari semua sinyal ini. Anda dapat menggunakan informasi mendetail ini untuk menampilkan indikator pemuatan yang sesuai untuk pengguna Anda.
Status pemuatan
Library Paging menampilkan status pemuatan untuk digunakan di UI melalui objek LoadState
. Objek LoadState
mengambil salah satu dari tiga bentuk, bergantung pada status pemuatan saat ini:
- Jika tidak ada operasi pemuatan yang aktif dan tidak ada error,
LoadState
adalah objek LoadState.NotLoading
. Subclass ini juga menyertakan
properti endOfPaginationReached
, yang menunjukkan apakah akhir penomoran halaman telah tercapai. - Jika ada operasi pemuatan yang aktif,
LoadState
adalah objek LoadState.Loading
. - Jika ada error,
LoadState
adalah objek
LoadState.Error
.
Ada dua cara untuk menggunakan LoadState
di UI Anda: menggunakan pemroses, atau menggunakan adaptor daftar khusus untuk menyajikan status pemuatan langsung dalam daftar RecyclerView
.
Mengakses status pemuatan dengan pemroses
Untuk mendapatkan status pemuatan bagi penggunaan umum di UI Anda, gunakan aliran loadStateFlow
atau metode addLoadStateListener()
yang disediakan oleh PagingDataAdapter
Anda. Mekanisme ini
menyediakan akses ke objek CombinedLoadStates
yang menyertakan informasi tentang perilaku LoadState
untuk setiap jenis pemuatan.
Dalam contoh berikut, PagingDataAdapter
menampilkan komponen UI yang berbeda, bergantung pada status pemuatan refresh saat ini:
Kotlin
// Activities can use lifecycleScope directly, but Fragments should instead use
// viewLifecycleOwner.lifecycleScope.
lifecycleScope.launch {
pagingAdapter.loadStateFlow.collectLatest { loadStates ->
progressBar.isVisible = loadStates.refresh is LoadState.Loading
retry.isVisible = loadState.refresh !is LoadState.Loading
errorMsg.isVisible = loadState.refresh is LoadState.Error
}
}
Java
pagingAdapter.addLoadStateListener(loadStates -> {
progressBar.setVisibility(loadStates.refresh instanceof LoadState.Loading
? View.VISIBLE : View.GONE);
retry.setVisibility(loadStates.refresh instanceof LoadState.Loading
? View.GONE : View.VISIBLE);
errorMsg.setVisibility(loadStates.refresh instanceof LoadState.Error
? View.VISIBLE : View.GONE);
});
Java
pagingAdapter.addLoadStateListener(loadStates -> {
progressBar.setVisibility(loadStates.refresh instanceof LoadState.Loading
? View.VISIBLE : View.GONE);
retry.setVisibility(loadStates.refresh instanceof LoadState.Loading
? View.GONE : View.VISIBLE);
errorMsg.setVisibility(loadStates.refresh instanceof LoadState.Error
? View.VISIBLE : View.GONE);
});
Untuk informasi selengkapnya tentang CombinedLoadStates
, baca Mengakses informasi status pemuatan tambahan.
Menampilkan status pemuatan dengan adaptor
Library Paging menyediakan adaptor daftar lain yang disebut
LoadStateAdapter
untuk menyajikan status pemuatan langsung dalam daftar data yang di-page yang ditampilkan. Adaptor ini memberikan akses ke status pemuatan daftar saat ini, yang dapat Anda teruskan ke holder tampilan kustom yang menampilkan informasi tersebut.
Pertama-tama, buat class holder tampilan yang menyimpan referensi ke tampilan pemuatan dan error pada layar Anda. Buat fungsi
bind()
yang menerima LoadState
sebagai parameter. Fungsi ini harus mengalihkan visibilitas tampilan berdasarkan parameter status pemuatan:
Kotlin
class LoadStateViewHolder(
parent: ViewGroup,
retry: () -> Unit
) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context)
.inflate(R.layout.load_state_item, parent, false)
) {
private val binding = LoadStateItemBinding.bind(itemView)
private val progressBar: ProgressBar = binding.progressBar
private val errorMsg: TextView = binding.errorMsg
private val retry: Button = binding.retryButton
.also {
it.setOnClickListener { retry() }
}
fun bind(loadState: LoadState) {
if (loadState is LoadState.Error) {
errorMsg.text = loadState.error.localizedMessage
}
progressBar.isVisible = loadState is LoadState.Loading
retry.isVisible = loadState is LoadState.Error
errorMsg.isVisible = loadState is LoadState.Error
}
}
Java
class LoadStateViewHolder extends RecyclerView.ViewHolder {
private ProgressBar mProgressBar;
private TextView mErrorMsg;
private Button mRetry;
LoadStateViewHolder(
@NonNull ViewGroup parent,
@NonNull View.OnClickListener retryCallback) {
super(LayoutInflater.from(parent.getContext())
.inflate(R.layout.load_state_item, parent, false));
LoadStateItemBinding binding = LoadStateItemBinding.bind(itemView);
mProgressBar = binding.progressBar;
mErrorMsg = binding.errorMsg;
mRetry = binding.retryButton;
}
public void bind(LoadState loadState) {
if (loadState instanceof LoadState.Error) {
LoadState.Error loadStateError = (LoadState.Error) loadState;
mErrorMsg.setText(loadStateError.getError().getLocalizedMessage());
}
mProgressBar.setVisibility(loadState instanceof LoadState.Loading
? View.VISIBLE : View.GONE);
mRetry.setVisibility(loadState instanceof LoadState.Error
? View.VISIBLE : View.GONE);
mErrorMsg.setVisibility(loadState instanceof LoadState.Error
? View.VISIBLE : View.GONE);
}
}
Java
class LoadStateViewHolder extends RecyclerView.ViewHolder {
private ProgressBar mProgressBar;
private TextView mErrorMsg;
private Button mRetry;
LoadStateViewHolder(
@NonNull ViewGroup parent,
@NonNull View.OnClickListener retryCallback) {
super(LayoutInflater.from(parent.getContext())
.inflate(R.layout.load_state_item, parent, false));
LoadStateItemBinding binding = LoadStateItemBinding.bind(itemView);
mProgressBar = binding.progressBar;
mErrorMsg = binding.errorMsg;
mRetry = binding.retryButton;
}
public void bind(LoadState loadState) {
if (loadState instanceof LoadState.Error) {
LoadState.Error loadStateError = (LoadState.Error) loadState;
mErrorMsg.setText(loadStateError.getError().getLocalizedMessage());
}
mProgressBar.setVisibility(loadState instanceof LoadState.Loading
? View.VISIBLE : View.GONE);
mRetry.setVisibility(loadState instanceof LoadState.Error
? View.VISIBLE : View.GONE);
mErrorMsg.setVisibility(loadState instanceof LoadState.Error
? View.VISIBLE : View.GONE);
}
}
Selanjutnya, buat class yang mengimplementasikan LoadStateAdapter
,
dan tentukan metode onCreateViewHolder()
dan onBindViewHolder()
. Metode tersebut membuat instance view holder kustom Anda
dan mengikat status pemuatan terkait.
Kotlin
// Adapter that displays a loading spinner when
// state is LoadState.Loading, and an error message and retry
// button when state is LoadState.Error.
class ExampleLoadStateAdapter(
private val retry: () -> Unit
) : LoadStateAdapter() {
override fun onCreateViewHolder(
parent: ViewGroup,
loadState: LoadState
) = LoadStateViewHolder(parent, retry)
override fun onBindViewHolder(
holder: LoadStateViewHolder,
loadState: LoadState
) = holder.bind(loadState)
}
Java
// Adapter that displays a loading spinner when
// state is LoadState.Loading, and an error message and retry
// button when state is LoadState.Error.
class ExampleLoadStateAdapter extends LoadStateAdapter {
private View.OnClickListener mRetryCallback;
ExampleLoadStateAdapter(View.OnClickListener retryCallback) {
mRetryCallback = retryCallback;
}
@NotNull
@Override
public LoadStateViewHolder onCreateViewHolder(@NotNull ViewGroup parent,
@NotNull LoadState loadState) {
return new LoadStateViewHolder(parent, mRetryCallback);
}
@Override
public void onBindViewHolder(@NotNull LoadStateViewHolder holder,
@NotNull LoadState loadState) {
holder.bind(loadState);
}
}
Java
// Adapter that displays a loading spinner when
// state is LoadState.Loading, and an error message and retry
// button when state is LoadState.Error.
class ExampleLoadStateAdapter extends LoadStateAdapter {
private View.OnClickListener mRetryCallback;
ExampleLoadStateAdapter(View.OnClickListener retryCallback) {
mRetryCallback = retryCallback;
}
@NotNull
@Override
public LoadStateViewHolder onCreateViewHolder(@NotNull ViewGroup parent,
@NotNull LoadState loadState) {
return new LoadStateViewHolder(parent, mRetryCallback);
}
@Override
public void onBindViewHolder(@NotNull LoadStateViewHolder holder,
@NotNull LoadState loadState) {
holder.bind(loadState);
}
}
Untuk menampilkan proses pemuatan di header dan footer, panggil metode
withLoadStateHeaderAndFooter()
dari objek PagingDataAdapter
Anda.
Kotlin
pagingAdapter
.withLoadStateHeaderAndFooter(
header = ExampleLoadStateAdapter(adapter::retry),
footer = ExampleLoadStateAdapter(adapter::retry)
)
Java
pagingAdapter
.withLoadStateHeaderAndFooter(
new ExampleLoadStateAdapter(pagingAdapter::retry),
new ExampleLoadStateAdapter(pagingAdapter::retry));
Java
pagingAdapter
.withLoadStateHeaderAndFooter(
new ExampleLoadStateAdapter(pagingAdapter::retry),
new ExampleLoadStateAdapter(pagingAdapter::retry));
Sebagai gantinya,
Anda dapat memanggil withLoadStateHeader()
atau withLoadStateFooter()
jika Anda ingin daftar RecyclerView
menampilkan status pemuatan hanya di header atau hanya di footer.
Objek CombinedLoadStates
dari PagingDataAdapter
menyediakan informasi tentang status pemuatan untuk implementasi PagingSource
serta untuk implementasi RemoteMediator
Anda, jika ada.
Agar mudah, Anda dapat menggunakan properti refresh
,
append
, dan prepend
dari CombinedLoadStates
guna mengakses objek LoadState
untuk jenis pemuatan yang sesuai. Properti ini biasanya berbeda dari status pemuatan dari implementasi RemoteMediator
, jika ada; jika tidak, properti tersebut berisi status pemuatan
yang sesuai dari implementasi PagingSource
. Untuk informasi lebih mendetail tentang logika yang mendasarinya, baca dokumentasi referensi untuk CombinedLoadStates
.
Kotlin
lifecycleScope.launch {
pagingAdapter.loadStateFlow.collectLatest { loadStates ->
// Observe refresh load state from RemoteMediator if present, or
// from PagingSource otherwise.
refreshLoadState: LoadState = loadStates.refresh
// Observe prepend load state from RemoteMediator if present, or
// from PagingSource otherwise.
prependLoadState: LoadState = loadStates.prepend
// Observe append load state from RemoteMediator if present, or
// from PagingSource otherwise.
appendLoadState: LoadState = loadStates.append
}
}
Java
pagingAdapter.addLoadStateListener(loadStates -> {
// Observe refresh load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState refreshLoadState = loadStates.refresh;
// Observe prepend load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState prependLoadState = loadStates.prepend;
// Observe append load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState appendLoadState = loadStates.append;
});
Java
pagingAdapter.addLoadStateListener(loadStates -> {
// Observe refresh load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState refreshLoadState = loadStates.refresh;
// Observe prepend load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState prependLoadState = loadStates.prepend;
// Observe append load state from RemoteMediator if present, or
// from PagingSource otherwise.
LoadState appendLoadState = loadStates.append;
});
Namun, penting untuk diingat bahwa hanya status pemuatan PagingSource
yang dijamin akan sinkron dengan update UI. Karena properti refresh
, append
, dan prepend
berpotensi dapat mengambil status pemuatan dari PagingSource
atau RemoteMediator
, properti tersebut tidak dijamin akan sinkron dengan update UI. Hal ini dapat menyebabkan masalah UI ketika pemuatan telah selesai sebelum data baru apa pun ditambahkan ke UI tersebut.
Karena
alasan ini, aksesor praktis berfungsi dengan baik untuk menampilkan status pemuatan di header atau footer. Namun, untuk kasus penggunaan lain, Anda mungkin perlu secara spesifik mengakses status pemuatan dari PagingSource
atau RemoteMediator
. CombinedLoadStates
menyediakan properti source
dan
mediator
untuk tujuan ini. Setiap properti ini menampilkan objek LoadStates
yang berisi objek LoadState
, masing-masing untuk PagingSource
atau RemoteMediator
:
Kotlin
lifecycleScope.launch {
pagingAdapter.loadStateFlow.collectLatest { loadStates ->
// Directly access the RemoteMediator refresh load state.
mediatorRefreshLoadState: LoadState? = loadStates.mediator.refresh
// Directly access the RemoteMediator append load state.
mediatorAppendLoadState: LoadState? = loadStates.mediator.append
// Directly access the RemoteMediator prepend load state.
mediatorPrependLoadState: LoadState? = loadStates.mediator.prepend
// Directly access the PagingSource refresh load state.
sourceRefreshLoadState: LoadState = loadStates.source.refresh
// Directly access the PagingSource append load state.
sourceAppendLoadState: LoadState = loadStates.source.append
// Directly access the PagingSource prepend load state.
sourcePrependLoadState: LoadState = loadStates.source.prepend
}
}
Java
pagingAdapter.addLoadStateListener(loadStates -> {
// Directly access the RemoteMediator refresh load state.
LoadState mediatorRefreshLoadState = loadStates.mediator.refresh;
// Directly access the RemoteMediator append load state.
LoadState mediatorAppendLoadState = loadStates.mediator.append;
// Directly access the RemoteMediator prepend load state.
LoadState mediatorPrependLoadState = loadStates.mediator.prepend;
// Directly access the PagingSource refresh load state.
LoadState sourceRefreshLoadState = loadStates.source.refresh;
// Directly access the PagingSource append load state.
LoadState sourceAppendLoadState = loadStates.source.append;
// Directly access the PagingSource prepend load state.
LoadState sourcePrependLoadState = loadStates.source.prepend;
});
Java
pagingAdapter.addLoadStateListener(loadStates -> {
// Directly access the RemoteMediator refresh load state.
LoadState mediatorRefreshLoadState = loadStates.mediator.refresh;
// Directly access the RemoteMediator append load state.
LoadState mediatorAppendLoadState = loadStates.mediator.append;
// Directly access the RemoteMediator prepend load state.
LoadState mediatorPrependLoadState = loadStates.mediator.prepend;
// Directly access the PagingSource refresh load state.
LoadState sourceRefreshLoadState = loadStates.source.refresh;
// Directly access the PagingSource append load state.
LoadState sourceAppendLoadState = loadStates.source.append;
// Directly access the PagingSource prepend load state.
LoadState sourcePrependLoadState = loadStates.source.prepend;
});
Operator rantai di LoadState
Karena objek CombinedLoadStates
memberikan akses ke semua perubahan di status pemuatan, penting untuk memfilter aliran status pemuatan berdasarkan peristiwa tertentu. Hal ini memastikan bahwa Anda mengupdate UI pada saat yang
tepat untuk menghindari update UI yang tersendat dan tidak penting.
Misalnya, anggaplah Anda ingin menampilkan tampilan kosong tetapi hanya setelah pemuatan data awal selesai. Kasus penggunaan ini mengharuskan Anda memastikan bahwa pemuatan refresh data telah dimulai, lalu tunggu status NotLoading
untuk mengonfirmasi bahwa refresh tersebut telah selesai. Anda harus memfilter semua sinyal, kecuali yang Anda perlukan:
Kotlin
lifecycleScope.launchWhenCreated {
adapter.loadStateFlow
// Only emit when REFRESH LoadState for RemoteMediator changes.
.distinctUntilChangedBy { it.refresh }
// Only react to cases where REFRESH completes, such as NotLoading.
.filter { it.refresh is LoadState.NotLoading }
// Scroll to top is synchronous with UI updates, even if remote load was
// triggered.
.collect { binding.list.scrollToPosition(0) }
}
Java
PublishSubject subject = PublishSubject.create();
Disposable disposable =
subject.distinctUntilChanged(CombinedLoadStates::getRefresh)
.filter(
combinedLoadStates -> combinedLoadStates.getRefresh() instanceof LoadState.NotLoading)
.subscribe(combinedLoadStates -> binding.list.scrollToPosition(0));
pagingAdapter.addLoadStateListener(loadStates -> {
subject.onNext(loadStates);
});
Java
LiveData liveData = new MutableLiveData<>();
LiveData refreshLiveData =
Transformations.map(liveData, CombinedLoadStates::getRefresh);
LiveData distinctLiveData =
Transformations.distinctUntilChanged(refreshLiveData);
distinctLiveData.observeForever(loadState -> {
if (loadState instanceof LoadState.NotLoading) {
binding.list.scrollToPosition(0);
}
});
Contoh ini menunggu hingga status pemuatan refresh diupdate, tetapi hanya memicu ketika statusnya NotLoading
. Cara ini memastikan bahwa refresh jarak jauh telah selesai sepenuhnya sebelum update UI apa pun dilakukan.
Stream API yang memungkinkan jenis operasi ini. Aplikasi Anda
dapat menentukan peristiwa pemuatan yang diperlukannya dan menangani data baru saat kriteria yang sesuai telah terpenuhi.
Jelaskan apa yang dimaksud dengan data teks?
Tipe Data Teks (String) merupakan tipe data yang bisa kita gunakan untuk menampung banyak karakter dengan jumlah maksimum data yang dapat ditampung yakni sebanyak 255 karakter. Dibawah ini ada beberapa jenis-jenis tipe data string yang terdapat pada Database MySQL.
Jelaskan apa yang dimaksud dengan data angka?
data yang diperoleh dari alat ukur yang bisa dibandingkan dan berbentuk data kuantitatif.
Tuliskan jenis jenis data apa saja yang bisa dihitung dengan bantuan MS excel?
Terdapat 3 tipe data Microsoft Excel yang dapat anda masukkan pada sel Microsoft Excel, yaitu: tipe data text, tipe data numerik, dan tipe data waktu.
Jelaskan apa itu data angka data teks dan data tanggal atau waktu?
data teks/ huruf = data yang sifatnya umum, seperti halnya pada aplikasi pengolah kata. 3. data tanggal =data yang memakai pemisah garis miring (/) atau tanda strip (-) pada saat dituliskan. 4. data waktu = data yang menggunakan tanda titik dua (:) pada saat data dituliskan.