【发布时间】:2014-02-27 02:05:14
【问题描述】:
我正在开发一种应用程序来控制您的 Day Pills。它包含一个药丸列表(带有名称和时间),您可以添加一个药丸。
应用程序正确启动,我可以转到添加布局,但是当我单击“添加”时它会停止。我不知道它为什么会停止;我认为这与将新药丸保存到database 有关。
我尝试将时间和名称作为意图附加内容(意图从添加布局转到主布局)并尝试将它们从 Main 类中保存(我认为它可能无法保存因为我试图从 Add Class 中做到这一点)。
这里是主要活动:
package com.example.pilladvisor;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView listPastilles;
private SQLiteDatabase db;
private Pastilla[] datos;
private TextView pastis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent h = getIntent();
Boolean afegit = h.getBooleanExtra("AFEGIT",false);
if (afegit) {
int hora = h.getIntExtra("HORA", 0);
String nom = h.getStringExtra("NOM");
ContentValues nuevoRegistro = new ContentValues();
nuevoRegistro.put("nom", nom);
nuevoRegistro.put("hora", hora);
db.insert("Pastilles", null, nuevoRegistro);
}
PastillesSQLiteHelper bdh =
new PastillesSQLiteHelper(this, "DBPastilles", null, 1);
db = bdh.getWritableDatabase();
//startService (new Intent(this, ServeiHora.class));
Cursor c = db.rawQuery("SELECT nom, hora FROM Pastilles", null);
int i = 0;
if (c.moveToFirst()) {
//Recorremos el cursor hasta que no haya más registros
i = 0;
do {
String nom = c.getString(0);
int hora = c.getInt(1);
datos[i] = new Pastilla(nom,hora);
++i;
} while(c.moveToNext());
}
pastis = (TextView)findViewById(R.id.textView1);
if (i == 0){
pastis.setText("No tens pastilles!");
}
else {
pastis.setText("Hi ha " + i + " alarmes programades.");
AdaptadorPastilles adaptador = new AdaptadorPastilles(this);
listPastilles = (ListView)findViewById(R.id.listPastilles);
listPastilles.setAdapter(adaptador);
}
Button Boto1 = (Button)findViewById(R.id.button1);
Boto1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Afegir.class);
startActivity(intent);
}
});
}
class AdaptadorPastilles extends ArrayAdapter<Pastilla> {
Activity context;
AdaptadorPastilles(Activity context) {
super(context, R.layout.listitem_pastilla, datos);
this.context = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View item = inflater.inflate(R.layout.listitem_pastilla, null);
TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);
lblTitulo.setText(datos[position].getTitulo());
TextView lblSubtitulo =(TextView)item.findViewById(R.id.LblSubTitulo); lblSubtitulo.setText(datos[position].getSubtitulo());
return(item);
}
}
}
这里有 Add 活动:
package com.example.pilladvisor;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Afegir extends Activity{
private EditText field_nom;
private EditText field_hora;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_afegir);
field_nom = (EditText)findViewById(R.id.editText1);
field_hora = (EditText)findViewById(R.id.editText2);
Button Boto1 = (Button)findViewById(R.id.button1);
Boto1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Afegir.this, MainActivity.class);
startActivity(intent);
}
});
Button Boto2 = (Button)findViewById(R.id.button2);
Boto2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String nom = field_nom.getText().toString();
int hora = Integer.parseInt(field_hora.getText().toString());
Intent intent = new Intent(Afegir.this, MainActivity.class);
intent.putExtra("AFEGIT",true);
intent.putExtra("NOM", nom);
intent.putExtra("HORA", hora);
startActivity(intent);
}
});
}
}
最后是数据库类:
package com.example.pilladvisor;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class PastillesSQLiteHelper extends SQLiteOpenHelper {
String sqlCreate = "CREATE TABLE Pastilles (nom TEXT, hora INTEGER)";
public PastillesSQLiteHelper(Context contexto, String nom, CursorFactory factory, int version) {
super(contexto, nom, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(sqlCreate);
}
@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva){
db.execSQL("DROP TABLE IF EXISTS Pastilles");
db.execSQL(sqlCreate);
}
}
错误提示:
02-03 15:23:33.492: E/AndroidRuntime(666): FATAL EXCEPTION: main
02-03 15:23:33.492: E/AndroidRuntime(666): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pilladvisor/com.example.pilladvisor.MainActivity}: java.lang.NullPointerException
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.access$700(ActivityThread.java:134)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.os.Looper.loop(Looper.java:137)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.main(ActivityThread.java:4867)
02-03 15:23:33.492: E/AndroidRuntime(666): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 15:23:33.492: E/AndroidRuntime(666): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 15:23:33.492: E/AndroidRuntime(666): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
02-03 15:23:33.492: E/AndroidRuntime(666): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
02-03 15:23:33.492: E/AndroidRuntime(666): at dalvik.system.NativeStart.main(Native Method)
02-03 15:23:33.492: E/AndroidRuntime(666): Caused by: java.lang.NullPointerException
02-03 15:23:33.492: E/AndroidRuntime(666): at com.example.pilladvisor.MainActivity.onCreate(MainActivity.java:40)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.Activity.performCreate(Activity.java:5047)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
02-03 15:23:33.492: E/AndroidRuntime(666): ... 11 more
【问题讨论】:
-
Caused by: java.lang.NullPointerException at com.example.pilladvisor.MainActivity.onCreate(MainActivity.java:40)-- 第 40 行是什么?有些东西是空的,不应该是空的。
标签: android sql eclipse exception