首页 > 解决方案 > 如何创建将对象存储在 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

标签: androidandroid-room

解决方案


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

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

然后,添加关于你的信息ProductDaoWordRoomDatabase你可以重命名这个类以使其成为其他东西,因为它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);

然后,在MainActivityvia中处理它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();
    }
}

推荐阅读