我如何通过我的存储库获取我的 ID?
How do i get my id out through my repository?
我在 AsyncTask
的后台有一个房间数据库 运行,当调用它时,它会插入我作为实体拥有的某些 class。我的 CustomerDao
中的请求可以 return 只要一个 id。
虽然我正在使用存储库将我的 class 保存到房间数据库中,但为此我需要一个 AsyncTask 和一些 void 才能实现我的插入功能。
但我现在的问题是如何通过存储库和 AsyncTask
将这么长的时间发送到我的 MainViewController
?我无法从新的 InsertAsync 任务中请求 long?那么我如何 return 我的 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;
}
}
}
首先,使用单个 ASyncTask
来处理删除和插入(将来可能更多)是错误的。你应该知道 AsyncTask
只是一个工人,因为你使用 Repository
模式,它不应该包含任何逻辑。您应该创建一个 return 长的任务:
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
}
我在 AsyncTask
的后台有一个房间数据库 运行,当调用它时,它会插入我作为实体拥有的某些 class。我的 CustomerDao
中的请求可以 return 只要一个 id。
虽然我正在使用存储库将我的 class 保存到房间数据库中,但为此我需要一个 AsyncTask 和一些 void 才能实现我的插入功能。
但我现在的问题是如何通过存储库和 AsyncTask
将这么长的时间发送到我的 MainViewController
?我无法从新的 InsertAsync 任务中请求 long?那么我如何 return 我的 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;
}
}
}
首先,使用单个 ASyncTask
来处理删除和插入(将来可能更多)是错误的。你应该知道 AsyncTask
只是一个工人,因为你使用 Repository
模式,它不应该包含任何逻辑。您应该创建一个 return 长的任务:
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
}