我正在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);
}
什麼是行號91碼? –
該行說,在deleteAssignment的錯誤()方法 6月5日至1日:再次com.mada.assignmentmanager.AssignmentManagerDatabase.deleteAssignment(AssignmentManagerDatabase.java:91) 檢查:31:42.682:E/AndroidRuntime(1417) ,或雙擊這一行,並檢查它會告訴你在你的應用崩潰的地方。 –
第91行@ AssignmentManagerDatabase類。發佈代碼 – Libin