我会告诉你这部分应用的目的。我有一个有3列的SQLite dB。首先是“数量”,第二个是“产品”,第三个是“价格”。好吧,我想要做的是获得整个dB并通过电子邮件发送它。 这就是我现在所拥有的:
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中显示数据。这是问题所在。我的dB最多有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);
}
}
我收到的是因为我的电子邮件的消息是“空”。
答案 0 :(得分:0)
我认为您的问题如下:您永远不会初始化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子句中有如此多的代码是非常糟糕的做法,它被称为expection handling。不要这样做。否则,如果你初始化你的数组(我不确定你还没有完成,但这是我猜你隐藏的异常是什么)你应该好好去。但是,不要忘记将代码放在catch块之外,因为在修改之后我不希望有任何异常。
编辑我不喜欢迭代数据库中元素的方式。我不熟悉您使用的SQLManager
课程。但是标准的Android方式与JDBC模型非常相似。您执行查询并在结果上返回一个光标。请参阅此处使用游标和SQLitehleprs
的示例:http://www.higherpass.com/Android/Tutorials/Accessing-Data-With-Android-Cursors/2/