1

我正在android中制作一个简单的应用程序。我无法运行程序,logcat 显示此错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.tasks/com.sample.tasks.ToDo}: java.lang.NullPointerException

经过检查,看起来他们的问题在这个陈述中:

db = DBHelper.getWritableDatabase();

或此声明:

final String DATABASE_CREATE = "CREATE TABLE tasks(sno INTEGER PRIMARY KEY ASC, todo TEXT);";
    db.execSQL(DATABASE_CREATE);

这是完整的代码:

    public class DBAdapter {

    public static final String KEY_ROWID = "SNo";
    public static final String KEY_TASKS =  "Tasks";


    private static final String DATABASE_NAME = "Records";
    private static final String DATABASE_TABLE = "Tasks";
    private static final int DATABASE_VERSION = 1;

    private final Context context;
    private DbHelper DBHelper;
    private static SQLiteDatabase db;

    public DBAdapter(Context ctx)
    { 
    this.context = ctx;
    DBHelper = new DbHelper(context);
    }

    private static class DbHelper extends SQLiteOpenHelper
    {
    DbHelper(Context context)
    {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        db.execSQL("Create Table " + DATABASE_TABLE + "(" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_TASKS + " TEXT )");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE );
                System.out.println("Updating the Database");
                onCreate(db);
    }

}
    public DBAdapter open() throws SQLException
    {
    db = DBHelper.getWritableDatabase();
    return this;
    }

    public void close()
    {
    DBHelper.close();
    System.out.println("In close");
    }

    public long createEntry(String task){
        .....
    }

    public String[] getData() {
        .....
    }

}

我尝试寻找未初始化的对象(因此为空)但找不到任何东西。请帮助我,我错过了什么?

更新

这是所涉及的其他文件的主要部分:

public class ToDo extends Activity implements OnClickListener{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.to_do);


        String[] tasks = new String[16];

        //Retrive tasks from database and view it on the screen
        DBAdapter info = new DBAdapter(this);
        info.open();
        tasks = info.getData();
        info.close();
    }
}

这是完整的错误消息:

07-15 16:11:19.187: E/AndroidRuntime(914): FATAL EXCEPTION: main
07-15 16:11:19.187: E/AndroidRuntime(914): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.tasks/com.sample.tasks.ToDo}: java.lang.NullPointerException
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.os.Looper.loop(Looper.java:123)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-15 16:11:19.187: E/AndroidRuntime(914):  at java.lang.reflect.Method.invokeNative(Native Method)
07-15 16:11:19.187: E/AndroidRuntime(914):  at java.lang.reflect.Method.invoke(Method.java:507)
07-15 16:11:19.187: E/AndroidRuntime(914):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-15 16:11:19.187: E/AndroidRuntime(914):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-15 16:11:19.187: E/AndroidRuntime(914):  at dalvik.system.NativeStart.main(Native Method)
07-15 16:11:19.187: E/AndroidRuntime(914): Caused by: java.lang.NullPointerException
07-15 16:11:19.187: E/AndroidRuntime(914):  at com.sample.tasks.DBAdapter$DbHelper.onCreate(DBAdapter.java:46)
07-15 16:11:19.187: E/AndroidRuntime(914):  at com.sample.tasks.DBAdapter.open(DBAdapter.java:60)
07-15 16:11:19.187: E/AndroidRuntime(914):  at com.sample.tasks.ToDo.onCreate(ToDo.java:59)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-15 16:11:19.187: E/AndroidRuntime(914):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
4

2 回答 2

1

Answering the question, as given by njzk2 in comments,

In the onCreate() method of the DBAdapter class, change the argument from arg0 to db. You are currently executing your query on another object that is not initialized.

于 2013-07-15T17:33:29.477 回答
0

在你的方法中 调用db.execSQL函数之前,调用. 如果数据库不存在,此方法将创建数据库,如果存在则打开它。onCreatedb = openOrCreateDatabase("MyDBPath", MODE_PRIVATE, null);

有关该功能的完整描述,请参阅文档

于 2013-07-15T15:39:26.997 回答