SQLite Android.Управление данными - PullRequest
0 голосов
/ 03 марта 2012

Я расскажу вам цель этой части моего приложения.У меня есть SQLite дБ, который имеет 3 столбца.Первый - «Количество», второй - «Продукт», третий - «Цена».Ну, я хочу получить весь дБ и отправить его по электронной почте.Вот что у меня сейчас:

public class Visual extends Activity {

TextView tv;
Button sqlGetInfo;
long l ;
long b=1;
int c,i;
String returnedQuantity ,returnedProduct ,returnedPrice;
String[] filas;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.visual);


    tv = (TextView) findViewById(R.id.tvSQLinfo);
    sqlGetInfo = (Button) findViewById(R.id.EnviarPedido);
    SQLManager info = new SQLManager(this);
    info.open();
    String data= info.getData();
    info.close();
    tv.setText(data);

До этого мой код работает нормально, он отображает данные в textView.Здесь проблема.Мой дБ имеет максимум 15 строк.То, что я хочу сделать, это хранить каждую строку в позиции массива строк (filas).Первая строка = filas (0), вторая строка = filas (1) ..., чтобы можно было передать этот массив другому действию.Если массив содержит менее 15 строк, я думаю, что это даст исключение.Итак, пришло время открыть другое действие.

    final SQLManager hon = new SQLManager(this);
    sqlGetInfo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            for (i = 1; i < 15; i++) { 

                    try{
                    l = (long) i;
                    hon.open();
                    returnedQuantity = hon.getQuantity(l);
                    returnedProduct = hon.getProduct(l);
                    returnedPrice = hon.getPrice(l);
                    hon.close();
                    c=(int)(l-b);
                    filas[c]="" + returnedQuantity+"      "+ returnedProduct+"      "+ returnedPrice + "\n";


                    }catch (Exception e){

                    i = 16;
                    l = (long) i;
                    Intent abrePedidos = new Intent(Visual.this, Pedidos.class);
                    abrePedidos.putExtra("pedidoCompleto", filas);
                    startActivity(abrePedidos);
                }
        }

    }
});
   }
 }

Другое действие таково:

public class Pedidos extends Activity {

String[] filas;
long numProd;
boolean end;
int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    filas=getIntent().getStringArrayExtra("pedidoCompleto");

    String subject = "Pedido a Domicilio";
    String cabecera = "Unid.     Producto            Precio\n\n";
    String[] emails = {"ulrickpspgo@gmail.com"};

    String message = cabecera + filas;

    Intent emailIntent = new Intent (android.content.Intent.ACTION_SEND);
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, emails);
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, message);
    emailIntent.setType("plain/text");
    startActivity(emailIntent);

    }
}

То, что я получаю, как сообщение моей электронной почты, является "нулевым".

1 Ответ

0 голосов
/ 03 марта 2012

Я думаю, что ваша проблема в следующем: вы никогда не инициализируете String[] filas;. Это означает, что он остается нулевым все время. После этого вы переходите к своему коду:

try {
    l = (long) i;
    hon.open();
    returnedQuantity = hon.getQuantity(l);
    returnedProduct = hon.getProduct(l);
    returnedPrice = hon.getPrice(l);
    hon.close();
    c=(int)(l-b);
    // The next line throws null pointer exception
    filas[c]="" + returnedQuantity+"      "+ returnedProduct+"      "+ returnedPrice + "\n";
} catch (Exception e) { // here you catch the null pointer exception
    i = 16;
    l = (long) i;
    Intent abrePedidos = new Intent(Visual.this, Pedidos.class);
    abrePedidos.putExtra("pedidoCompleto", filas); //filas is still null
    startActivity(abrePedidos);
}

Я добавил комментарии для некоторых ваших строк. Почему вы называете следующее действие только в предложении catch? Наличие такого большого количества кода в предложении catch - очень плохая практика, это называется обработка ожиданий . не делай этого В противном случае, если вы инициализируете свой массив (что я не уверен, что вы еще этого не сделали, но я догадываюсь, что за исключением того, что вы скрываете), у вас все получится. Не забывайте размещать код вне блока catch, потому что я не ожидаю никаких исключений после модификации.

РЕДАКТИРОВАТЬ Мне не нравится, как вы перебираете элементы в базе данных. Я не знаком с классом SQLManager, который вы используете. Однако стандартный способ Android очень похож на модель JDBC. Вы делаете запрос, и он возвращает курсор на результаты. Смотрите пример использования курсоров и SQLitehleprs здесь: http://www.higherpass.com/Android/Tutorials/Accessing-Data-With-Android-Cursors/2/

...