2014-05-01 49 views
0

我正在Eclipse上做一個Android開發。該應用程序可以做以下的事情:應用程序停止並重新啓動後點擊確認按鈕

  • 添加新的任務
  • 修改分配
  • 刪除分配

現在我遇到的問題是,每當我試圖刪除的分配,應用程序將在我點擊確認按鈕後立即崩潰。

這是logcat的:

05-01 06:31:26.772: I/Choreographer(1417): Skipped 36 frames! The application may be doing too much work on its main thread. 
05-01 06:31:26.912: I/Choreographer(1417): Skipped 30 frames! The application may be doing too much work on its main thread. 
05-01 06:31:37.582: I/Choreographer(1417): Skipped 103 frames! The application may be doing too much work on its main thread. 
05-01 06:31:37.772: I/Choreographer(1417): Skipped 39 frames! The application may be doing too much work on its main thread. 
05-01 06:31:40.232: I/Choreographer(1417): Skipped 58 frames! The application may be doing too much work on its main thread. 
05-01 06:31:40.682: I/Choreographer(1417): Skipped 112 frames! The application may be doing too much work on its main thread. 
05-01 06:31:42.662: D/AndroidRuntime(1417): Shutting down VM 
05-01 06:31:42.662: W/dalvikvm(1417): threadid=1: thread exiting with uncaught exception (group=0xb3adeba8) 
05-01 06:31:42.682: E/AndroidRuntime(1417): FATAL EXCEPTION: main 
05-01 06:31:42.682: E/AndroidRuntime(1417): Process: com.mada.assignmentmanager, PID: 1417 
05-01 06:31:42.682: E/AndroidRuntime(1417): java.lang.NullPointerException 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at com.mada.assignmentmanager.AssignmentManagerDatabase.deleteAssignment(AssignmentManagerDatabase.java:91) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at com.mada.assignmentmanager.AssignmentManagerView$1.onClick(AssignmentManagerView.java:74) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at android.os.Handler.dispatchMessage(Handler.java:102) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at android.os.Looper.loop(Looper.java:136) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at java.lang.reflect.Method.invoke(Method.java:515) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
05-01 06:31:42.682: E/AndroidRuntime(1417):  at dalvik.system.NativeStart.main(Native Method) 
05-01 06:31:42.722: D/dalvikvm(1417): GC_FOR_ALLOC freed 166K, 7% free 3914K/4196K, paused 33ms, total 41ms 
05-01 06:31:47.922: I/Process(1417): Sending signal. PID: 1417 SIG: 9 
05-01 06:31:49.402: D/dalvikvm(1452): GC_FOR_ALLOC freed 73K, 7% free 2947K/3140K, paused 125ms, total 129ms 
05-01 06:31:49.402: I/dalvikvm-heap(1452): Grow heap (frag case) to 3.596MB for 635812-byte allocation 
05-01 06:31:49.462: D/dalvikvm(1452): GC_FOR_ALLOC freed 2K, 6% free 3565K/3764K, paused 52ms, total 52ms 
05-01 06:31:50.292: I/Choreographer(1452): Skipped 59 frames! The application may be doing too much work on its main thread. 
05-01 06:31:50.322: D/gralloc_goldfish(1452): Emulator without GPU emulation detected. 

這裏是我的行動「刪除分配」代碼:從上面的代碼

private void deleteAssignment() { 
    // TODO Auto-generated method stub 
    AlertDialog.Builder dgbox = new AlertDialog.Builder(this); 
    dgbox.setTitle("Confirm to delete"); 
    dgbox.setMessage("Are you sure to delete this assignment?"); 

    dgbox.setPositiveButton("Delete", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int whichButton) { 
        final AssignmentManagerDatabase db = new AssignmentManagerDatabase(
          AssignmentManagerView.this); 
        db.deleteAssignment(assignID); 
        finish(); 
       } 
      }); // setPositiveButton 

    // provide a button that simply dismisses the dialog 
    dgbox.setNegativeButton("Cancel", null); 
    dgbox.show(); 
} 

,你可以看到,我提出了一個對話框,當我選擇刪除作業時。該應用將停止並重新啓動。所選的作業不會被刪除。

我有一個菜單來選擇刪除:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.menuAdd: 
     Intent addAssignment = new Intent(this, AssignmentAddNew.class); 
     startActivity(addAssignment); 
     return true; 
    case R.id.menuModify: 
     Intent editAssignment = new Intent(this, AssignmentEdit.class); 
     startActivity(editAssignment); 
     return true; 
    case R.id.menuDelete: 
     deleteAssignment(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

以下是完整的數據庫代碼:

package com.mada.assignmentmanager; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class AssignmentManagerDatabase { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_MODULECODE = "module_code"; 
public static final String KEY_ASSIGNMENTNAME = "assignment_name"; 
public static final String KEY_MARKSPROPORTION = "marks_proportion"; 
public static final String KEY_DUEDATE = "due_date"; 
public static final String KEY_PROGRESS = "_progress"; 

private static final String DATABASE_NAME = "Assignmentdb"; 
private static final String DATABASE_TABLE = "AssignmentTable"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 
String cmd; 

private static class DbHelper extends SQLiteOpenHelper { 

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

    private static final String CREATE_NEW_DATABASE = "CREATE TABLE " 
      + DATABASE_TABLE + " (" + KEY_ROWID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_MODULECODE 
      + " TEXT NOT NULL, " + KEY_ASSIGNMENTNAME + " TEXT NOT NULL, " 
      + KEY_MARKSPROPORTION + " INTEGER, " + KEY_DUEDATE 
      + " TEXT NOT NULL, " + KEY_PROGRESS + " INTEGER);"; 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(CREATE_NEW_DATABASE); 
    } 

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

public AssignmentManagerDatabase(Context c) { 
    ourContext = c; 
} 

public AssignmentManagerDatabase open() { 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

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

public void createEntry(String moduleCode, String assignmentName, 
     String marksProportion, String dueDate, String assignmentProgress) { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_MODULECODE, moduleCode); 
    cv.put(KEY_ASSIGNMENTNAME, assignmentName); 
    cv.put(KEY_MARKSPROPORTION, marksProportion); 
    cv.put(KEY_DUEDATE, dueDate); 
    cv.put(KEY_PROGRESS, assignmentProgress); 
    ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 

public Cursor getAllAssignments() { 
    // String[] columns = new String[]{KEY_ROWID, KEY_MODULECODE, 
    // KEY_ASSIGNMENTNAME, KEY_MARKSPROPORTION, KEY_DUEDATE, KEY_PROGRESS}; 
    String[] columns = new String[] { KEY_ROWID, KEY_DUEDATE }; 
    return ourDatabase.query(DATABASE_TABLE, columns, null, null, null, 
      null, KEY_DUEDATE); 
} 

public void deleteAssignment(long id) { 
    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + id, null); 
} 

public Cursor getOneAssignment(long assignID) { 
    // TODO Auto-generated method stub 
    return ourDatabase.query(DATABASE_TABLE, null, KEY_ROWID + "=" 
      + assignID, null, null, null, null); 
} 

} 

這是我的數據庫刪除操作:

public void deleteAssignment(long id) { 
    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + id, null); 
} 
+1

什麼是行號91碼? –

+0

該行說,在deleteAssignment的錯誤()方法 6月5日至1日:再次com.mada.assignmentmanager.AssignmentManagerDatabase.deleteAssignment(AssignmentManagerDatabase.java:91) 檢查:31:42.682:E/AndroidRuntime(1417) ,或雙擊這一行,並檢查它會告訴你在你的應用崩潰的地方。 –

+0

第91行@ AssignmentManagerDatabase類。發佈代碼 – Libin

回答

0
final Context context = this; 
       dgbox.Builder alertDialogBuilder = new AlertDialog.Builder(
         context); 

        // set title 
        dgbox.setTitle(""); 

        // set dialog message 
        dgbox 
         .setMessage("No Records Found!") 
         .setCancelable(false) 
         .setPositiveButton("Exit",new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog,int id) { 

        final AssignmentManagerDatabase db = new AssignmentManagerDatabase(
        AssignmentManagerView.this); 
        db.deleteAssignment(assignID); 
        finish(); 

          } 
          }); 

         // create alert dialog 
         alertDialog = dgbox.create(); 

         // show it 
         alertDialog.show() 
+0

Hi @Boopathi,謝謝你回答我的問題。 =)我可以知道Context類是從哪裏來的嗎?我不明白那部分代碼。 – Kween

+0

從這裏上下文是當前活動 – Boopathi

0

你需要調用open()方法來打開調用deleteAsignment

隨着出庫公開徵集前的數據庫,ourDatabase將爲空

 final AssignmentManagerDatabase db = new AssignmentManagerDatabase(
         AssignmentManagerView.this); 
     db.open(): 
       db.deleteAssignment(assignID); 
+0

謝謝@Libin ^^我現在可以刪除所選的作業=) – Kween

相關問題