【问题标题】:How to pass an int data with an intent?如何传递带有意图的 int 数据?
【发布时间】:2018-11-19 16:18:58
【问题描述】:

嗨,我正在做一个项目,我正在使用房间持久性来管理我的数据库,但是当我从我的活动中获取 id 并将其传递给另一个活动以编辑数据时,它会给出不兼容的类型

这是我的 DaoClass,我想调用 getOne 方法

 @Insert
void insert(Entradas entradas);

@Update
void update(Entradas entradas);

@Delete
void delete(Entradas entradas);

@Query("DELETE FROM Entradas")
void deleteAll();

@Query("SELECT * FROM Entradas")
LiveData<List<Entradas>> getAll();  

@Query("SELECT * FROM Entradas WHERE IdEntrada ==:Id")
LiveData<Entradas> getOne(int Id);

这是我的活动,当我使用方法 longClickListener 将我发送到另一个活动时

        adapter.addActionCallback(new EntradasAdapter.ActionCallback() {
        @Override
        public void onLongClickListener(Entradas entradas) {
            Intent intent = new Intent(getActivity(), UpdateEntradaActivity.class);
            intent.putExtra(UpdateEntradaActivity.EXTRA_ENTRADA_ID,  entradas.getIdEntrada());
            startActivity(intent);
        }
    });

这是我要显示数据的活动

public static String EXTRA_ENTRADA_ID = "IdEntrada";

private Button btnCalendario, btnCrear;
private EditText etNombre, etSaldo;
private TextView etFecha;
Calendar c;
DatePickerDialog dpd;
private CategoriaEntradasViewModel viewModel;
private CuentasViewModel viewModel1;
private EntradasViewModel viewModel2;
Spinner spinner, spinner1;
List<CategoriaEntradas> categoriaEntradas1;
List<Cuentas> cuentas1;
private EntradasDao mEntradasDAO;
private Entradas ENTRADAS;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_update_entrada);

    getSupportActionBar().setTitle(Html.fromHtml("<font color='#FFFFFF'>"+"Editar Entrada"+"</font>"));
    getSupportActionBar().setElevation(0);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    mEntradasDAO = Room.databaseBuilder(this, Database.class, "Database")
            .allowMainThreadQueries()       //Allows room to do operation on main thread
            .build()
            .entradasDao();

    final Context ctx = this;
    etNombre= findViewById(R.id.editText);
    etSaldo= findViewById(R.id.editText4);
    etFecha = (TextView) findViewById(R.id.txtFecha);
    btnCalendario= (Button) findViewById(R.id.btnFecha);
    btnCrear = findViewById(R.id.btnCrear);



    ENTRADAS = mEntradasDAO.getOne(getIntent().getStringExtra(EXTRA_ENTRADA_ID));
}

错误在最后一行ENTRADAS = mEntradasDAO.getOne(getIntent().getStringExtra(EXTRA_ENTRADA_ID));

上面写着getOne(int) in EntradasDao cannot be applied to java.lang.String

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    您将输入为 Int,而在阅读时尝试获取为 String。 替换

        mEntradasDAO.getOne(getIntent().getStringExtra(EXTRA_ENTRADA_ID));
    with 
        mEntradasDAO.getOne(getIntent().getIntExtra(EXTRA_ENTRADA_ID,0));
    

    【讨论】:

    • 现在它说不兼容的类型要求:Entities.Entradas Found:lifecycle.LiveData
    【解决方案2】:

    读取该消息的方式是“方法getOne() 接受int,但您传递的是java.lang.String”。所以你必须弄清楚为什么你传递的值是String

    ENTRADAS = mEntradasDAO.getOne(getIntent().getStringExtra(EXTRA_ENTRADA_ID));
    

    不过,在您的情况下,这非常简单。您将getStringExtra() 调用的值传递给它,该调用始终是String

    有两条路径可以解决这个问题。您选择哪个取决于您输入Intent 的值实际上是String 还是int

    intent.putExtra(UpdateEntradaActivity.EXTRA_ENTRADA_ID,  entradas.getIdEntrada());
    

    如果entradas.getIdEntrada()int,那么你可以改变事情的另一面,简单地检索一个int 额外:

    ENTRADAS = mEntradasDAO.getOne(getIntent().getIntExtra(EXTRA_ENTRADA_ID, 0));
    

    如果entradas.getIdEntrada()String,那么您将不得不更改另一端以检索String,然后将其解析为int

    String idString = getIntent().getStringExtra(EXTRA_ENTRADA_ID);
    int idInt = Integer.parseInt(idString);
    ENTRADAS = mEntradasDAO.getOne(idInt);
    

    编辑

    正如 cmets 中提到的,getOne() 方法的返回值是一个LiveData&lt;Entradas&gt;,而不仅仅是一个Entradas。虽然这不是使用 LiveData 的推荐方式,但出于本问题的目的,您可以通过调用 getValue() 来检索该值。

    int idInt = getIntent().getIntExtra(EXTRA_ENTRADA_ID, 0);
    ENTRADAS = mEntradasDAO.getOne(idInt).getValue();
    
    String idString = getIntent().getStringExtra(EXTRA_ENTRADA_ID);
    int idInt = Integer.parseInt(idString);
    ENTRADAS = mEntradasDAO.getOne(idInt).getValue();
    

    【讨论】:

    • 现在它说不兼容的类型需要:Entities.Entradas 找到:生命周期.LiveData
    • LiveData 对象的工作原理超出了本问题的范围,但您可以通过调用 getValue() 来获取 LiveData 的当前值。所以你可以说ENTRADAS = mEntradasDAO.getOne(idInt).getValue();
    • 谢谢,但现在我在其他活动中得到空值
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多