代码实验室Android Room with a View使用以下code插入新对象:
public class NewWordActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.android.wordlistsql.REPLY";
private EditText mEditWordView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_word);
mEditWordView = findViewById(R.id.edit_word);
final Button button = findViewById(R.id.button_save);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent replyIntent = new Intent();
if (TextUtils.isEmpty(mEditWordView.getText())) {
setResult(RESULT_CANCELED, replyIntent);
} else {
String word = mEditWordView.getText().toString();
replyIntent.putExtra(EXTRA_REPLY, word);
setResult(RESULT_OK, replyIntent);
}
finish();
}
});
}
}
我还不清楚这是如何工作的以及在何处处理此意图。特别是,我不知道如何更改功能以存储自己的对象,该对象包含的数据不仅仅是字符串:
public class MyClass{
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
private int id;
@NonNull
@ColumnInfo(name = "name")
private String name;
@NonNull
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "value")
private int value;
...
}
如何创建保存MyClass
的意图?
答案 0 :(得分:2)
首先,为您的数据定义一些实体类:
@Entity(tableName = "products")
public class ProductEntity {
@PrimaryKey
private int id;
private String name;
private String description;
private int price;
@Override
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public ProductEntity() {
}
public ProductEntity(int id, String name, String description, int price) {
this.id = id;
this.name = name;
this.description = description;
this.price = price;
}
}
第二,为其创建一个DAO类。可能如下:
@Dao
public interface ProductDao {
@Query("SELECT * FROM products")
LiveData<List<ProductEntity>> loadAllProducts();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<ProductEntity> products);
@Query("select * from products where id = :productId")
LiveData<ProductEntity> loadProduct(int productId);
@Query("select * from products where id = :productId")
ProductEntity loadProductSync(int productId);
}
然后,将有关ProductDao
的信息添加到WordRoomDatabase
(您可以重命名该类以使其变为其他名称,因为它现在不仅可以处理Word
个对象):>
@Database(entities = {Word.class, ProductEntity.class}, version = 1)
public abstract class WordRoomDatabase extends RoomDatabase {
...
public abstract ProductDao productDao();//add this os that Room generates ProductDao_Impl
...
}
专门为您的ProductRepository
创建一个新的ProductEntity
:
public class ProductRepository {
private LiveData<List<ProductEntity>> mAllProducts;
private ProductDao mProductDao;
WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
mProductDao = db.productDao();
mAllProducts = mProductDao.loadAllProducts();
}
public LiveData<List<ProductEntity>> getAllProducts() {
return mAllProducts;
}
public void insert (ProductEntity product) {
new insertAsyncTask(mProductDao).execute(product);
}
private static class insertAsyncTask extends AsyncTask<ProductEntity, Void, Void> {
private ProductDao mProductDao;
insertAsyncTask(ProductDao dao) {
mProductDao = dao;
}
@Override
protected Void doInBackground(final ProductEntity... params) {
mAsyncTaskDao.insert(Arrays.asList(params[0]));
return null;
}
}
}
为ProductViewModel
创建ProductEntity
,以便可以从MainActivity
插入/检索数据:
public class ProductViewModel extends AndroidViewModel {
private ProductRepository mRepository;
private LiveData<List<ProductEntity>> mAllProducts;
public ProductViewModel (Application application) {
super(application);
mRepository = new ProductRepository(application);
mAllProducts = mRepository.getAllProducts();
}
LiveData<List<ProductEntity>> getAllProducts() { return mAllProducts; }
public void insert(ProductEntity product) { mRepository.insert(product); }
}
按如下所示启动您的ProductActivity
:
Intent intent = new Intent(MainActivity.this, ProductActivity.class);
startActivityForResult(intent, PRODUCT_RESULT_CODE);
您可以通过以下方式将ProductEntity
对象从ProductActivity
发送到MainActivity
:
//product is set by you somewhere
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, product);
setResult(RESULT_OK, replyIntent);
然后,通过MainActivity
在onActivityResult
中进行处理,并使用productViewModel
保存产品:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == NEW_WORD_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
Word word = new Word(data.getStringExtra(NewWordActivity.EXTRA_REPLY));
mWordViewModel.insert(word);
} else if (requestCode == PRODUCT_RESULT_CODE && resultCode == RESULT_OK) {
ProductEntity product = (ProductEntity) data.getSerializableExtra(NewWordActivity.EXTRA_MYCLASS_REPLY);
productViewModel.insert(product);
} else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}