java - 我如何通过我的存储库获取我的 ID?

标签 java android repository android-room

我有一个房间数据库在 AsyncTask 的后台运行,当调用它时,它会插入我作为实体拥有的特定类。我的 CustomerDao 中的请求可以返回一个 long 作为一个 id。

问题是我正在使用存储库将我的类保存到房间数据库中,为此我需要一个 AsyncTask 和一些 void 才能实现我的插入功能。

但我现在的问题是如何通过存储库和 AsyncTask 将这么长的时间发送到我的 MainViewController?我无法从新的 InsertAsync 任务中请求 long?那么如何将我的 ID 一直返回到 MainActivity

告诉我您需要什么代码,我很乐意为您提供帮助,但现在我会将我的主要代码和存储库发送给您。

主要 Activity :

package com.example.jenso.paperseller;

import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class MainActivity extends AppCompatActivity {
    FloatingActionButton fab;
    private CustomerViewModel mCustomerViewModel;
    public static final int NEW_CUSTOMER_ACTIVITY_REQUEST_CODE = 1;
    private static final  String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        RecyclerView recyclerView = findViewById(R.id.recycler);

        final PapperRecyclerAdapter adapter = new PapperRecyclerAdapter(this);

        fab = findViewById(R.id.fab);

        mCustomerViewModel = ViewModelProviders.of(this).get(CustomerViewModel.class);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT ) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            }
        }).attachToRecyclerView(recyclerView);

        mCustomerViewModel.getmAllCustomers().observe(this, new Observer<List<Customer>>() {
            @Override
            public void onChanged(@Nullable List<Customer> customers) {
                adapter.setCustomer(customers);
            }
        });

        recyclerView.setAdapter(adapter);
        fab.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, CreateCustomer.class);
                startActivityForResult(intent, NEW_CUSTOMER_ACTIVITY_REQUEST_CODE);
            }
        });
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    public void onActivityResult(final int requestCode, final int resultCode, final Intent data){
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == NEW_CUSTOMER_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
            String[] mCustomerSave = data.getStringArrayExtra(CreateCustomer.EXTRA_REPLY);
            Customer customer = new Customer(mCustomerSave[0],mCustomerSave[1],mCustomerSave[2],mCustomerSave[3]);
            Long id  = mCustomerViewModel.insert(customer);
        } else {
            Toast.makeText(
                    getApplicationContext(),
                    R.string.empty_not_saved,
                    Toast.LENGTH_LONG).show();
        }
    }
}

存储库:

package com.example.jenso.paperseller;

import android.app.Application;
import android.arch.lifecycle.LiveData;
import android.os.AsyncTask;

import java.util.List;

public class CustomerRepository {
    private CustomerDao mCustomerDao;
    private LiveData<List<Customer>> mAllCustomers;

    public CustomerRepository(Application application) {
            CustomerDatabase db = CustomerDatabase.getDatabase(application);

            mAllCustomers = mCustomerDao.getAllCustomers();
            mCustomerDao = db.customerDao();
    }

    LiveData<List<Customer>> getAllCustomers(){
        return mAllCustomers;
    }
    //public void deleteOneCustomer(int id){new insertAsyncTask(mCustomerDao).}

    public void insert (Customer customer){
        new insertAsyncTask(mCustomerDao).execute(customer);
    }

    public void delete(Customer customer) {
        new insertAsyncTask(mCustomerDao).execute(customer);
    }

    private static class insertAsyncTask extends AsyncTask<Customer, Void, Void> {
        private CustomerDao mAsyncTaskDao;

        insertAsyncTask(CustomerDao dao) {
            mAsyncTaskDao = dao;
        }

        @Override
        protected Void doInBackground(final Customer... params) {
            mAsyncTaskDao.insertAll(params[0]);

            return null;
        }
    }
}

最佳答案

首先,使用单个 ASyncTask 来处理删除和插入(将来可能更多)是错误的。您应该知道 AsyncTask 只是一个 worker,因为您使用 Repository 模式,所以它不应该包含任何逻辑。您应该创建一个返回长的任务:

 private static class DeleteTask extends AsyncTask<Customer, Void, Long> {
        private CustomerDao dao;

        DeleteTask (CustomerDao dao) {
            this.dao = dao;
        }

        @Override
        protected Long doInBackground(final Customer... params) {
            return dao.delete(params[0]);;
        }
    }

其次,因为您使用存储库模式,您可以只在存储库本身内格式化所需的响应:

public long delete(Customer customer) {
        new insertAsyncTask(mCustomerDao).execute(customer);
        return customer.id; //Return Primary key
    }

关于java - 我如何通过我的存储库获取我的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49316306/

相关文章:

android - ADB 连接到 Android TV/Nvidia Shield TV?

android - Facebook 通知 - URL 上的代码参数是什么

android - 实现启动和停止传感器android

java - Alfresco 仅作为存储库 : how to organize data?

java - 如何在另一个java程序-netbeans中编译&运行java程序

java - 如何在java 8中过滤Optional.empty

c# - 假 DataRepository - 模拟数据库

SVN 文件夹(非存储库范围)权限

java - 查找和替换文件中的单词/行

java - 在命令提示符下运行的 java 程序中使用 package 关键字