代码之家  ›  专栏  ›  技术社区  ›  Christian

如何创建将对象存储在房间中的意图?

  •  2
  • Christian  · 技术社区  · 7 年前

    代码实验室 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 是吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Anatolii    7 年前

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

    @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 产品实体 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);
    

    你可以把你的 主要活动

    //product is set by you somewhere
    Intent replyIntent = new Intent();
    replyIntent.putExtra(EXTRA_REPLY, product);
    setResult(RESULT_OK, replyIntent);
    

    主要活动 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();
        }
    }