2013-02-15 13 views
0

突然間,所有數據庫功能都不能在我的應用程序上工作。該錯誤始終是NullPointer exception,並指向dataObjectsProvider class的不同方法,取決於使用哪個函數。例如,當試圖在CreateDataObjectsMethod上插入值時,試圖將數據庫清空/刪除到deleteObjectsMethod。 所有這些函數在我最後一次關閉eclipse的時候工作,我很確定我沒有改變其他任何東西,除了我試圖使其工作的onClick方法的更新按鈕。這並不能解釋爲什麼所有其他功能都不起作用。你能否檢查我是否意外犯了一個我看不到的錯誤?突然,所有數據庫功能在我的應用程序上失敗

DataObjectsProvider類:

public class DataObjectsProvider { 

    // Database fields 
    private SQLiteDatabase database; 
    private DbHelper dbHelper; 
    private String[] allColumns = { DbHelper.COLUMN_ID, 
     DbHelper.COLUMN_SONGNAME, DbHelper.COLUMN_SONGARTIST, 
     DbHelper.COLUMN_SONGGENRE }; 

    public DataObjectsProvider (Context context) { 
     dbHelper = new DbHelper(context); 
     } 

    public void open() throws SQLException { 
     dbHelper.getWritableDatabase(); 
     } 

    public void close() { 
     dbHelper.close(); 
     } 

    public DataObjects createDataObjects (String songName, String songArtist, 
      String songGenre) { 
     dbHelper.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(DbHelper.COLUMN_SONGNAME, songName); 
     values.put(DbHelper.COLUMN_SONGARTIST, songArtist); 
     values.put(DbHelper.COLUMN_SONGGENRE, songGenre); 
     long insertId = database.insert(DbHelper.TABLE_SONGS, null, 
       values); 
      Cursor cursor = database.query(DbHelper.TABLE_SONGS, 
       allColumns, DbHelper.COLUMN_ID + " = " + insertId, null, 
       null, null, null); 
      cursor.moveToFirst(); 
      DataObjects newDobject = cursorToDataObjects(cursor); 
      cursor.close(); 
      return newDobject; 

     } 

    public Cursor fechAllDobjects(){ 

     Cursor mCursor = database.query(DbHelper.TABLE_SONGS, 
       new String[] {DbHelper.COLUMN_ID, 
       DbHelper.COLUMN_SONGNAME, DbHelper.COLUMN_SONGARTIST, 
       DbHelper.COLUMN_SONGGENRE}, 
       null, null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
      } 
      return mCursor; 
    } 

    public Cursor fechDobjectsByName(String inputText) throws SQLException { 

     Cursor mCursor = null; 
     if (inputText == null || inputText.length() == 0) { 
     mCursor = database.query(DbHelper.TABLE_SONGS, 
     new String[] {DbHelper.COLUMN_ID, 
     DbHelper.COLUMN_SONGNAME, DbHelper.COLUMN_SONGARTIST, 
     DbHelper.COLUMN_SONGGENRE}, 
     null, null, null, null, null); 

     } 
     else { 
     mCursor = database.query(true, DbHelper.TABLE_SONGS, 
     new String[] {DbHelper.COLUMN_ID, 
     DbHelper.COLUMN_SONGNAME, DbHelper.COLUMN_SONGARTIST, 
     DbHelper.COLUMN_SONGGENRE}, 
     DbHelper.COLUMN_SONGNAME + " like '%" + inputText + "%'", null, 
     null, null, null, null); 
     } 
     if (mCursor != null) { 
     mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

    /* public void deleteDobjects(DataObjects dobjects) { 
      long id = dobjects.getId(); 
      database.delete(DbHelper.TABLE_SONGS, DbHelper.COLUMN_ID 
       + " = " + id, null); 

     }*/ 
     public void DeleteItem(long l) 
     { 
    dbHelper.getWritableDatabase(); 
    String query = "DELETE FROM songs WHERE _id="+l; 
    database.execSQL(query); 
     } 

     public void UpdateItem(int id, String songName, String songArtist, String songGenre) { 
      dbHelper.getWritableDatabase(); 
      ContentValues values = new ContentValues(); 
      values.put(DbHelper.COLUMN_SONGNAME, songName); 
      values.put(DbHelper.COLUMN_SONGARTIST, songArtist); 
      values.put(DbHelper.COLUMN_SONGGENRE, songGenre); 
      database.update(DbHelper.TABLE_SONGS, values, DbHelper.COLUMN_ID +"="+id, null); 
     } 

     public void deleteAllDobjects() { 
      dbHelper.getWritableDatabase(); 
      database.delete(DbHelper.TABLE_SONGS, null, null); 
     } 

     public List<DataObjects> getAlldobjects() { 
      List<DataObjects> dobjects = new ArrayList<DataObjects>(); 

      Cursor cursor = database.query(DbHelper.TABLE_SONGS, 
       allColumns, null, null, null, null, null); 

      cursor.moveToFirst(); 
      while (!cursor.isAfterLast()) { 
       DataObjects dobject = cursorToDataObjects(cursor); 
       dobjects.add(dobject); 
       cursor.moveToNext(); 
      } 
      // Make sure to close the cursor 
      cursor.close(); 
      return dobjects; 

     } 

    private DataObjects cursorToDataObjects(Cursor cursor) { 
     DataObjects dobject = new DataObjects(); 
     dobject.setId(cursor.getLong(0)); 
     dobject.setSongName(cursor.getString(1)); 
     dobject.setSongArtist(cursor.getString(2)); 
     dobject.setSongGenre(cursor.getString(3)); 
     return dobject; 
    } 

}

數據庫輔助類:

public class DbHelper extends SQLiteOpenHelper { 


     public static final String TABLE_SONGS = "songs"; 
     public static final String COLUMN_ID = "_id"; 
     public static final String COLUMN_SONGNAME = "songname"; 
     public static final String COLUMN_SONGARTIST = "artist"; 
     public static final String COLUMN_SONGGENRE = "genre"; 

     private static final String DATABASE_NAME = "songsdb.db"; 
     private static final int DATABASE_VERSION = 1; 

     // Database creation sql statement 
     private static final String DATABASE_CREATE = "create table " 
      + TABLE_SONGS + "(" 
      + COLUMN_ID + " integer primary key autoincrement, " 
      + COLUMN_SONGNAME + "," 
      + COLUMN_SONGARTIST + "," 
      + COLUMN_SONGGENRE + ");"; 

     public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase database) { 
     database.execSQL(DATABASE_CREATE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
     Log.w(DbHelper.class.getName(), 
      "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will destroy all old data"); 
     database.execSQL("DROP TABLE IF EXISTS " + TABLE_SONGS); 
     onCreate(database); 
     } 
} 

刪除數據庫日誌:

02-15 13:33:13.158: W/dalvikvm(1966): threadid=1: thread exiting with uncaught exception (group=0x40c931f8) 
02-15 13:33:13.168: E/AndroidRuntime(1966): FATAL EXCEPTION: main 
02-15 13:33:13.168: E/AndroidRuntime(1966): java.lang.NullPointerException 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at com.d69.dancesongsdb.DataObjectsProvider.deleteAllDobjects(DataObjectsProvider.java:113) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at com.d69.dancesongsdb.MainActivity$3.onClick(MainActivity.java:102) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at android.os.Looper.loop(Looper.java:137) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
02-15 13:33:13.168: E/AndroidRuntime(1966):  at dalvik.system.NativeStart.main(Native Method) 

插入數據記錄:

02-15 13:35:36.457: W/dalvikvm(2104): threadid=1: thread exiting with uncaught exception (group=0x40c931f8) 
02-15 13:35:36.477: E/AndroidRuntime(2104): FATAL EXCEPTION: main 
02-15 13:35:36.477: E/AndroidRuntime(2104): java.lang.NullPointerException 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at com.d69.dancesongsdb.DataObjectsProvider.createDataObjects(DataObjectsProvider.java:39) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at com.d69.dancesongsdb.MainActivity$2.onClick(MainActivity.java:66) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.view.View.performClick(View.java:3511) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.view.View$PerformClick.run(View.java:14105) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.os.Handler.handleCallback(Handler.java:605) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.os.Looper.loop(Looper.java:137) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
02-15 13:35:36.477: E/AndroidRuntime(2104):  at dalvik.system.NativeStart.main(Native Method) 
+0

請發表logcat輸出 – 2013-02-15 11:15:24

回答

0

你有幾行代碼是剛:

dbHelper.getWritableDatabase(); 

現在,這實際上不會做任何事情。相反,我認爲要做到這一點:

database = dbHelper.getWritableDatabase(); 

如果沒有這條線,在databasenull當你在createDataObjects這導致NullPointerException使用它。

我發現至少有5個情況發生,所以請確保您全部更改。

+0

非常感謝。你說得對,我有這條線,我不記得刪除它,至少從創建/刪除方法,因爲工作,並沒有需要去觸摸它們。儘管arch linux和Eclipse有一些問題,但會導致系統速度下降並掛起。所以最近的時間(在這些功能開始失敗之前)我被迫殺死Eclipse。也許這會導致一些數據丟失。和所有其他的dbHelper.getWritableDatabase();我在錯誤之後添加了他們,因爲我認爲某處存在問題。我是新來的編程和SQL特別是雖然很明顯,我做錯了 – user2057220 2013-02-15 11:57:52

+0

非常感謝您寶貴的建議。 – user2057220 2013-02-15 11:59:39

相關問題