如何创建在 Room 中存储对象的意图?



Codelab Android Room with a View 使用以下代码插入一个新对象:

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的意图?

首先,为数据定义一些实体类:

@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
...
}

专门为您的ProductEntity创建一个新ProductRepository

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

ProductEntity创建ProductViewModel,以便可以从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);

然后,通过onActivityResultMainActivity处理它,并使用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();
}
}

最新更新