2012-02-15 300 views
3

我需要幫助。 我有一個ListView與自定義適配器,當在此ListView中我有一個複選框,並在onClick方法應更新我的數據庫中的表。 我的onClick我的CheckBox的方法在我的適配器類實現的,而當我點擊一些複選框,我打電話給我的其他類中的方法時創建我的ListView。openOrCreateDatabase不起作用

以我適配器CLASSE

chkQuitado.setOnClickListener(new View.OnClickListener() { 
@Override 
    public void onClick(View v) { 
    CheckBox cb = (CheckBox) v; 
    ViewMovimentos vm = new ViewMovimentos(); 

    int movId = Integer.parseInt(entry.getMovId()); 
    if(cb.isChecked()){ 
    vm.confirmaQuitacao(context, movId); //Implementada na classe ViewMovimentos 
    }else{ 
    vm.desfazQuitacao(context, movId); //Implementada na classe ViewMovimentos 
    } 
    } 
}); 

以我Movimentos.class我實現我的方法confirmaQuitacao()和desfazQuitacao()

public void confirmaQuitacao(Context context, final int movId){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setMessage("Confirma a quitação deste movimento?"); 
    builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     quitaMovimento(movId, MOV_FECHADO); 
    } 
}); 
builder.setNeutralButton("Não", null); 


builder.setTitle("Aviso"); 
builder.show(); 
} 

public void desfazQuitacao(Context context, final int movId){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setMessage("Deseja marcar esse movimento como não quitado?"); 
    builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
    quitaMovimento(movId, MOV_ABERTO); 
    } 
}); 
builder.setNeutralButton("Não", null); 


builder.setTitle("Aviso"); 
builder.show(); 
} 

當這兩個方法調用quitaMovimento方法時。

public void quitaMovimento(int movId, int quitar){ 
    SQLiteDatabase banco = openOrCreateDatabase(nmBanco, MODE_WORLD_WRITEABLE, null); 

    ContentValues camposPar = new ContentValues(); 
    camposPar.put("movQuitado", quitar); 
    banco.update("movimentos", camposPar, "movId = "+movId, null); 

    localizaRegistros(); 
} 

所以,當我打電話openOrCreateDatabase()在我的應用程序發生密切力,和logcat的出現如下圖所示的錯誤。

02-14 22:47:33.645: E/AndroidRuntime(367): Uncaught handler: thread main exiting due to uncaught exception 
02-14 22:47:33.749: E/AndroidRuntime(367): java.lang.NullPointerException 
02-14 22:47:33.749: E/AndroidRuntime(367): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
02-14 22:47:33.749: E/AndroidRuntime(367): at com.simpatico.sgf.ViewMovimentos.quitaMovimento(ViewMovimentos.java:433) 
02-14 22:47:33.749: E/AndroidRuntime(367): at com.simpatico.sgf.ViewMovimentos$7.onClick(ViewMovimentos.java:450) 
02-14 22:47:33.749: E/AndroidRuntime(367): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158) 
02-14 22:47:33.749: E/AndroidRuntime(367): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-14 22:47:33.749: E/AndroidRuntime(367): at android.os.Looper.loop(Looper.java:123) 
02-14 22:47:33.749: E/AndroidRuntime(367): at android.app.ActivityThread.main(ActivityThread.java:4363) 
02-14 22:47:33.749: E/AndroidRuntime(367): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 22:47:33.749: E/AndroidRuntime(367): at java.lang.reflect.Method.invoke(Method.java:521) 
02-14 22:47:33.749: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
02-14 22:47:33.749: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
02-14 22:47:33.749: E/AndroidRuntime(367): at dalvik.system.NativeStart.main(Native Method) 

有人可以幫我解決這個問題?

感謝的

+0

你可以看到有一個'NullPointerException'這意味着你要麼提供了錯誤的參數或您的ContextWrapper爲空。你的數據庫類是否擴展了SQLiteDatabase類?也許你應該使用'openOrCreateDatabase(字符串路徑,SQLiteDatabase.CursorFactory廠)',而不是'openOrCreateDatabase(字符串路徑,SQLiteDatabase.CursorFactory工廠,DatabaseErrorHandler的ErrorHandler)' – 2012-02-15 12:21:26

+0

抱歉,但你在西班牙語中的代碼不可讀。你應該用英文寫。這對其他人來說是最容易調試的。 – damson 2012-02-15 12:26:05

+0

你在哪裏設置nmBanco? – Sparky 2012-02-15 12:33:31

回答

0

一些參數openOrCreateDatabase被記錄爲可選的,但是,這並不意味着你可以通過null那些;這意味着你應該在你根本不傳遞這些參數的地方使用重載。

這裏是一個語法會爲你工作:

SQLiteDatabase banco = openDatabase(nmBanco, MODE_WORLD_WRITEABLE, SQLiteDatabase.CREATE_IF_NECESSARY)