jonatasdaniel / andorm

Persistence framework for Android
23 stars 4 forks source link

Save Bug #33

Closed pavei closed 13 years ago

pavei commented 13 years ago

Estou tentando implementar um exemplo bem simples com um DAO genérico em um cadastro de um produto. A base está no local.

Não sei o que posso estar fazendo de errado, segue o código e o erro mais abaixo

public class GenericDAO<E> implements DAO{

    private Class classOfInstance;
    private  PersistenceManager manager;

    public GenericDAO(Class<E> classOfInstance) {
        super();
        this.classOfInstance = classOfInstance;
        this.manager = PMFactory.get();
    }

    @Override
    public void save(Object object) {
        this.manager.save(object);

    }

    @Override
    public void update(Object object) {
        this.manager.update(object);

    }

    @Override
    public void remove(Object object) {
         this.manager.delete(object);

    }

    @Override
    public Object find(Integer id) {
        return this.manager.read(this.classOfInstance, id);
    }

    @Override
    public List findAll() {
       Criteria query = Criteria.from(this.classOfInstance);

        return manager.find(this.classOfInstance, query);

    }

@Entity
@Table(value="product")
public class Product {

    @PrimaryKey
    @Column
    private Integer product_code;

    @Column
    private String product_name;

    private BigDecimal price;

    public Product() {
        super();
    }

    public Product(Integer product_code, String product_name, BigDecimal price) {
        super();
        this.product_code = product_code;
        this.product_name = product_name;
        this.price = price;
    }

    public Integer getProduct_code() {
        return product_code;
    }

    public void setProduct_code(Integer product_code) {
        this.product_code = product_code;
    }

    public String getProduct_name() {
        return product_name;
    }

    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

----------------------------Insert em um activity
  ProductDAO d = new ProductDAO(Product.class);
        Product p = new Product();
        p.setPrice(new BigDecimal(100));
        p.setProduct_code(100);
        p.setProduct_name("Salame");

        d.save(p);

-----------------

Erro: 08-02 06:10:30.267: ERROR/AndroidRuntime(5690): FATAL EXCEPTION: main
08-02 06:10:30.267: ERROR/AndroidRuntime(5690): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.viniciuspavei/br.com.viniciuspavei.ProductRequestActivity}: java.lang.NullPointerException
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.os.Looper.loop(Looper.java:123)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at java.lang.reflect.Method.invoke(Method.java:521)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at dalvik.system.NativeStart.main(Native Method)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690): Caused by: java.lang.NullPointerException
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.andorm.reflection.Invoker.withParams(Invoker.java:26)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.andorm.persistence.AndroidPersistenceManager.save(AndroidPersistenceManager.java:71)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.viniciuspavei.controller.GenericDAO.save(GenericDAO.java:22)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.viniciuspavei.ProductRequestActivity.onCreate(ProductRequestActivity.java:26)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
jonatasdaniel commented 13 years ago

Olá, tente fazer o seguinte: use os atributos como camel case, por exemplo, productCode, e na anotação column, coloque o valor name como product_code. Lembrando que, se sua coluna na tabela é exatamente o mesmo nome do seu atributo, a anotação @Column é desnecessária.

Deve resolver, de qualquer forma, obrigado por estar utilizando o AndOrm.

Em 02/08/2011 03:19, pavei escreveu:

Estou tentando implementar um exemplo bem simples com um DAO genérico em um cadastro de um produto. A base está no local.

Não sei o que posso estar fazendo de errado, segue o código e o erro mais abaixo

public class GenericDAO<E>  implements DAO{

  private Class classOfInstance;
  private  PersistenceManager manager;

  public GenericDAO(Class<E>  classOfInstance) {
      super();
      this.classOfInstance = classOfInstance;
      this.manager = PMFactory.get();
  }

  @Override
  public void save(Object object) {
      this.manager.save(object);

  }

  @Override
  public void update(Object object) {
      this.manager.update(object);

  }

  @Override
  public void remove(Object object) {
          this.manager.delete(object);

  }

  @Override
  public Object find(Integer id) {
      return this.manager.read(this.classOfInstance, id);
  }

  @Override
  public List findAll() {
        Criteria query = Criteria.from(this.classOfInstance);

      return manager.find(this.classOfInstance, query);

  }

@Entity
@Table(value="product")
public class Product {

  @PrimaryKey
  @Column
  private Integer product_code;

  @Column
  private String product_name;

  private BigDecimal price;

  public Product() {
      super();
  }

  public Product(Integer product_code, String product_name, BigDecimal price) {
      super();
      this.product_code = product_code;
      this.product_name = product_name;
      this.price = price;
  }

  public Integer getProduct_code() {
      return product_code;
  }

  public void setProduct_code(Integer product_code) {
      this.product_code = product_code;
  }

  public String getProduct_name() {
      return product_name;
  }

  public void setProduct_name(String product_name) {
      this.product_name = product_name;
  }

  public BigDecimal getPrice() {
      return price;
  }

  public void setPrice(BigDecimal price) {
      this.price = price;
  }

----------------------------Insert em um activity
   ProductDAO d = new ProductDAO(Product.class);
         Product p = new Product();
         p.setPrice(new BigDecimal(100));
         p.setProduct_code(100);
         p.setProduct_name("Salame");

         d.save(p);

-----------------

Erro: 08-02 06:10:30.267: ERROR/AndroidRuntime(5690): FATAL EXCEPTION: main
08-02 06:10:30.267: ERROR/AndroidRuntime(5690): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.viniciuspavei/br.com.viniciuspavei.ProductRequestActivity}: java.lang.NullPointerException
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.os.Looper.loop(Looper.java:123)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at java.lang.reflect.Method.invoke(Method.java:521)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at dalvik.system.NativeStart.main(Native Method)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690): Caused by: java.lang.NullPointerException
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.andorm.reflection.Invoker.withParams(Invoker.java:26)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.andorm.persistence.AndroidPersistenceManager.save(AndroidPersistenceManager.java:71)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.viniciuspavei.controller.GenericDAO.save(GenericDAO.java:22)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at br.com.viniciuspavei.ProductRequestActivity.onCreate(ProductRequestActivity.java:26)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-02 06:10:30.267: ERROR/AndroidRuntime(5690):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

Jonatas Daniel Hermann @jntsdaniel jonatasdaniel.wordpress.com

pavei commented 13 years ago

O mesmo erro continua..

@Entity
public class Product {

    @PrimaryKey
    @Column(name="product_code")
    private Integer productCode;

    @Column(name="product_name")
    private String productName;

    @Column(name="price")
    private BigDecimal price;

    public Product() {
        // TODO Auto-generated constructor stub
    }

    public Integer getProductCode() {
        return productCode;
    }

    public void setProductCode(Integer productCode) {
        this.productCode = productCode;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }
jonatasdaniel commented 13 years ago

Se não for pedir demais, tens como testar usando Double em vez de BigDecimal? Creio que há um bug quando ele trabalha com BigDecimal, mas preciso dessa confirmação para fazermos então a correção.

PS: Nesse seu caso, as anotações @Column são desnecessárias, pois o framework converte os nomes automaticamente para esse padrão minúsculo com underline.

pavei commented 13 years ago

Colocando para Double funcinou corretamente.

Abraço

jonatasdaniel commented 13 years ago

Ok, tens como criar uma nova issue específica para o problema do BigDecimal? De preferência em inglês, e coloque a tag 'bug' na issue. Grato.