2012-01-25 21 views
1

为什么此代码崩溃?我无法通过游标读取SQLite数据库。它总是崩溃

CustomDatabaseHelper.java:

public class CustomDatabaseHelper { 

SQLiteDatabase db; 
private static final String DATABASE_TABLE = "tbl_homework"; 
public static final String KEY_TITLE = "hw"; 
public static final String KEY_ROWID = "id"; 
private final Context mCtx; 

public Cursor executeSQLQuery(String query){ 
    Cursor c = db.rawQuery(query,null); 
    return c; 
} 

public Cursor fetchAllNotes() { 

    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE}, null, null, null, null, null); 
} 

public CustomDatabaseHelper(Context ctx) { 
    this.mCtx = ctx; 
}  
} 

homework.java:

public class homework extends ListActivity { 
SQLiteDatabase db; 
private CustomDatabaseHelper mDbHelper; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.homework); 

    //Create Database 
    db = openOrCreateDatabase("test_database.db", 
      SQLiteDatabase.CREATE_IF_NECESSARY, null); 

    db.setVersion(1); 
    db.setLocale(Locale.getDefault()); 
    db.setLockingEnabled(true); 

    //Create table tbl_homework 
    final String CREATE_TABLE_HW = 
      "CREATE TABLE IF NOT EXISTS tbl_homework (" 
      + "id INTEGER PRIMARY KEY AUTOINCREMENT," 
      + "hw TEXT);"; 

      db.execSQL(CREATE_TABLE_HW); 

    press_cmd_back(); 
    press_cmd_test_data(); 

    mDbHelper = new CustomDatabaseHelper(this); 

    fillData(); 
} 

//What will happen if cmd_back gets pressed 
private void press_cmd_back(){ 
    Button cmd_back = (Button)findViewById(R.id.cmd_back); 
    cmd_back.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      Intent Intent_main = new Intent(homework.this, Noten_HausaufgabenActivity.class); 
      startActivity(Intent_main); 
     } 
    }); 
} 

//What will happen if cmd_test_data gets pressed 
private void press_cmd_test_data(){ 
    Button cmd_test_data = (Button)findViewById(R.id.cmd_eintragen); 
    cmd_test_data.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      open_database_rw(); 
      EditText txt_hw = (EditText)findViewById(R.id.edt_eingabe); 
      String txt_insert_hw = txt_hw.getText().toString(); 

      final String INSERT_HW = "INSERT INTO tbl_homework ('hw') VALUES ('" + txt_insert_hw + "')"; 

      db.execSQL(INSERT_HW); 

     } 
    }); 

} 

//Open Database RW 
private void open_database_rw() { 
    db = SQLiteDatabase.openDatabase("/data/data/test.marco.notenha/databases/test_database.db", 
      null, SQLiteDatabase.OPEN_READWRITE); 
} 

private void fillData() { 
    // Get all of the notes from the database and create the item list 

    Cursor c = mDbHelper.fetchAllNotes(); 

    /*startManagingCursor(c); 

    String[] from = new String[] { CustomDatabaseHelper.KEY_TITLE }; 
    int[] to = new int[] {R.id.txt_notes_row}; 

    // Now create an array adapter and set it to display using our row 
    SimpleCursorAdapter notes = 
     new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); 
     setListAdapter(notes);*/ 
} 

} 

Error log: 

01-25 17:20:30.152: D/dalvikvm(7421): GC_EXTERNAL_ALLOC freed 48K, 50% free 2690K/5379K, external 0K/0K, paused 70ms 
01-25 17:20:30.835: D/dalvikvm(7421): GC_EXTERNAL_ALLOC freed 32K, 49% free 2757K/5379K, external 203K/523K, paused 19ms 
01-25 17:20:30.871: D/AndroidRuntime(7421): Shutting down VM 
01-25 17:20:30.871: W/dalvikvm(7421): threadid=1: thread exiting with uncaught exception (group=0x4006f568) 
01-25 17:20:30.871: E/AndroidRuntime(7421): FATAL EXCEPTION: main 
01-25 17:20:30.871: E/AndroidRuntime(7421): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.marco.notenha/test.marco.notenha.homework}: java.lang.NullPointerException 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1664) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.os.Looper.loop(Looper.java:130) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread.main(ActivityThread.java:3703) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at dalvik.system.NativeStart.main(Native Method) 
01-25 17:20:30.871: E/AndroidRuntime(7421): Caused by: java.lang.NullPointerException 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at test.marco.notenha.CustomDatabaseHelper.fetchAllNotes(CustomDatabaseHelper.java:22) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at test.marco.notenha.homework.fillData(homework.java:89) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at test.marco.notenha.homework.onCreate(homework.java:46) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-25 17:20:30.871: E/AndroidRuntime(7421):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628) 
+0

请在您的错误日志中应用一些格式 – diggingforfire

+0

这是CustomDatabaseHelper中的第22行吗?问题在那里。也许,调试,你会发现问题。 –

+0

编辑并添加作业标签 –

回答

1

该应用,因为在fetchAllNotes一个空指针的崩溃。发生这种情况是因为您没有初始化dbCustomDatabaseHelper中的任何内容。刚刚在onCreate()调用fillData()

mDbHelper.db = db; 

:您可以尝试加入这一行。这应该解决空指针异常。不过,如果数据库已经存在,我认为你的代码会有其他问题。您可能想看看SQLiteOpenHelper课程,以便更好地完成所有这些工作。 (另请阅读数据存储指南主题的"Using Databases" section。)

+0

谢谢@Ted Hopp ...解决了我的问题;) –