【问题标题】:How do i get my id out through my repository?如何通过我的存储库获取我的 ID?
【发布时间】:2018-03-16 08:38:44
【问题描述】:

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

问题是我使用存储库将我的课程保存到房间数据库中,为此我需要一个 AsyncTask 和一些 void 才能访问我的插入函数。

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

告诉我您需要什么代码,我很乐意为您提供帮助,不过现在我会将我的 Main 和 Repository 发送给您。

主活动:

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;
        }
    }
}

【问题讨论】:

标签: java android repository android-room


【解决方案1】:

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

 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
    }

【讨论】:

  • 我正在使用它,问题是我不在我的存储库中...我正在使用本教程,这就是我的代码的样子...codelabs.developers.google.com/codelabs/… 事情是我想获取 id 来删除客户
  • 啊,但是我如何在没有 id 的情况下调用 deleteTask
  • 不需要ID,房间可以使用您设置的主键推断您尝试删除的对象(在您的模型类中使用@PrimaryKey注释)
  • 是的,但是我的类中的主键是 id
  • 所以?房间用来删除对象的主键不是已经在客户对象中可用了吗?如果不是,那么您的整个代码逻辑在这里都是错误的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多