2010-12-02 18 views
1

ダイアログラッパーを使用してSqLiteデータベースにデータを挿入しようとしています。しかし、私はそうすることができません。私はタイトルとテンプレートと呼ばれる2つのテキストをデータベースに挿入する。しかし、それはクラッシュします。 以下は私のJavaコードです:
@Override 公共ブールonCreateOptionsMenu(メニューメニュー) { menu.add(0、MENU_ITEM_INSERT、0、R.string.menu_insert)。 がtrueを返します。 }以下sqliteデータベースにデータを挿入する際にエラーが発生しました

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch(item.getItemId()) 
    { 
     case MENU_ITEM_INSERT: 
      insert(); 
      //startActivity(new Intent(Intent.ACTION_INSERT,getIntent().getData())); 
      return true; 
    } 
    return(super.onOptionsItemSelected(item)); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo) 
{ 
    AdapterView.AdapterContextMenuInfo info; 
    try { 
     info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    } catch (ClassCastException e) { 
     Log.e(TAG, "bad menuInfo", e); 
     return; 
    } 

    mCursor = (Cursor) getListAdapter().getItem(info.position); 

    menu.setHeaderTitle(mCursor.getString(COLUMN_INDEX_TITLE)); 

    menu.add(0,MENU_ITEM_DELETE,0 ,R.string.menu_delete); 
    menu.add(1,MENU_ITEM_ADDTMESSAGE,1,R.string.menu_add); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) 
{ 
    AdapterView.AdapterContextMenuInfo info; 
    try { 
     info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    } catch (ClassCastException e) { 
     Log.e(TAG, "bad menuInfo", e); 
     return false; 
    } 

    switch(item.getItemId()) 
    { 
     case MENU_ITEM_DELETE: 
      //delete selected row 
      delete(info.id); 
      return true; 
     case MENU_ITEM_ADDTMESSAGE: 
      //ADD TO MESSAGE 
      return true; 
    } 
    return(super.onContextItemSelected(item)); 
} 

private void insert() 
{ 
    LayoutInflater inflater = LayoutInflater.from(this); 
    View addView = inflater.inflate(R.layout.templates_editor,null); 
    final DialogWrapper wrapper = new DialogWrapper(addView); 

    new AlertDialog.Builder(this) 
    .setTitle(R.string.menu_insert) 
    .setView(addView) 
    .setPositiveButton(R.string.item_ok,new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      processInsert(wrapper); 
     } 
    }) 
    .setNegativeButton(R.string.item_cancel,new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      // ignore, just dismiss 
     } 
    }) 
    .show(); 
} 

private void delete(final long rowId) 
{ 
    if(rowId > 0) 
    { 
     new AlertDialog.Builder(this) 
         .setTitle(R.string.menu_delete) 
         .setPositiveButton(R.string.item_ok, 
           new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface dialog, int which) { 
           processDelete(rowId); 
          } 
         }) 
         .setNegativeButton(R.string.item_cancel, 
           new DialogInterface.OnClickListener() { 

            public void onClick(DialogInterface dialog, int which) { 
             //dismiss dialog 
            } 
           }).show(); 
    } 
} 

private void processDelete(long rowId) 
{ 
    String[] args = {String.valueOf(rowId)}; 

    db.getWritableDatabase().delete("Templates", Templates._ID, args); 
    mCursor.requery(); 
} 

private void processInsert(DialogWrapper wrapper) 
{ 
    ContentValues cv = new ContentValues(); 

    cv.put("title", wrapper.getTitle()); 
    cv.put("template", wrapper.getTemplate()); 

    db.getWritableDatabase().insert("Templates", "title", cv); 
    db.getWritableDatabase().insert("Templates", "template", cv); 
    mCursor.requery(); 
} 

class DialogWrapper{ 
    EditText titleField = null; 
    EditText templateField = null; 
    View base = null; 

    DialogWrapper(View base) { 
     this.base = base; 
    } 

    String getTitle(){ 
     return(getTitleField().getText().toString()); 
    } 

    String getTemplate(){ 
     return(getTemplateField().getText().toString());    
    } 

    private EditText getTitleField(){ 
     if(titleField == null){ 
      titleField = (EditText) findViewById(R.id.title); 
     } 
     return titleField; 
    } 

    private EditText getTemplateField(){ 
     if(templateField == null){ 
      templateField = (EditText) findViewById(R.id.template); 
     } 
     return templateField; 
    } 
} 

は私logCatある:

12月2日08:23:17.712:ERROR/AndroidRuntime(204):キャッチされないハンドラ:キャッチされない例外により、メイン射出スレッド
12から02 08 :23:17.862:ERROR/AndroidRuntime(204):java.lang.NullPointerException
12-02 08:23:17.862:エラー/ AndroidRuntime(204):joel.GroupSMS.TemplatesList $ DialogWrapper.getTitle(TemplatesList.java: 214)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):joel.GroupSMS.TemplatesList.processInsert(TemplatesList。 java:196)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):joel.GroupSMS.TemplatesList.access $ 0(TemplatesList.java:192)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):joel.GroupSMS.TemplatesList $ 1.onClick(TemplatesList.java:150)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):com.android.internal.app.AlertControllerで$ ButtonHandler.handleMessage(AlertController.java:158)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):android.os.Handler.dispatchMessage(Handler.java:99)
12-02 08 :23:17.862:ERROR/AndroidRuntime(204):android.os.Looper.loop(Looper.java:123)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):android。 app.ActivityThread.main(ActivityThread.java:4363)
12月2日08:23:17.862:ERROR/AndroidRuntime(204):java.lang.reflect.Method.invokeNative(ネイティブメソッド)
12月2日08時:23:17.862:ERROR/AndroidRuntime(204):java.lang.reflect.Method.invoke(Method.java:521)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):com.android.internal.os.ZygoteInit.main(ZygoteInit .java:618)
12-02 08:23:17.862:ERROR/AndroidRuntime(204):dalvik.system.NativeStart.main(ネイティブメソッド)

編集
が私のコメントに関連する要求された。これは私のスタックトレースです:

12月6日16:54:12.466:INFO/ActivityManager(58):開始アクティビティ:テント{CMP = joel.GroupSMS/.TemplateEdit}
12-06 16:54:16.550:DEBUG/AndroidRuntime(254):VMをシャットダウンする 12-06 16:54:16.550:WARN/dalvikvm(254):threadid = 3:キャッチされていない例外(グループ= 0x4001b188)
12-06 16:54:16.550:エラー/ AndroidRuntime(254):キャッチされていないハンドラ:キャッチされていない例外のためにメインスレッドが終了する
12-06 16:54:16.736:ERROR/AndroidRuntime(254):java。 lang.RuntimeE xception:アクティビティを開始できませんComponentInfo {joel.GroupSMS/joel.GroupSMS.TemplateEdit}:java.lang.NullPointerException
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.app.ActivityThread.performLaunchActivity (ActivityThread。java:2496)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
12-06 16:54:16.736:エラー/ AndroidRuntime(254):android.app.ActivityThread.access $ 2200(ActivityThread.java:119)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.app.ActivityThread $ H.handleMessage (Handler.java:99)
12-06 16:54:16.736:エラー:AndroidRuntime ERROR/AndroidRuntime(254):android.os.Looper.loop(Looper.java:123)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.app.Activi tyThread.main(ActivityThread.java:4363)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):java.lang.reflect.Method.invokeNative(ネイティブメソッド)
12-06 16:54 :16.736:ERROR/AndroidRuntime(254):java.lang.reflect.Method.invoke(Method.java:521)
12-06 16:54:16.736:エラー/ AndroidRuntime(254):com.android。 internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):com.android.internal.os.ZygoteInit.main(ZygoteInit.java) :618)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):at dalvik.system.NativeStart.main(ネイティブメソッド)
12-06 16:54:16.736:ERROR/AndroidRuntime(254) :カウsed by java.lang.NullPointerException
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.content.ContentResolver.acquireProvider(ContentResolver.java:754)
12-06 16:54: 16736:ERROR/AndroidRuntime(254):android.content.ContentResolver.query(ContentResolver.java:197)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):android.app.Activity.managedQuery (Activity.java:1495)
12-06 16:54:16.736:ERROR/AndroidRuntime(254):joel.GroupSMS.TemplateEdit.onCreate(TemplateEdit.java:77)
12-06 16:54:16.736 :ERROR/AndroidRuntime(254):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-06 16:54:16 0.736:ERROR/AndroidRuntime(254):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

答えて

0

でそれはトレースバックを一致させるために、あなたのコード内の行番号なしで伝えるのは難しいのですが、私はその(EditText) findViewById(R.id.title)を推測していますヌルが返されます。挿入時に階層ビューアでアプリケーションをチェックし、階層内にあると思うビューが挿入コードを処理しているときに実際にそこにあることを確認してください。

+0

あなたはかなり近いです。エラーの行は "getTitleField"にあります。そして、はい、ビューは、挿入コードを処理するときに階層にあります。おもう。 –

+0

なぜDialogWrapperを使用しているのかわかりません。これはリストの状況でリサイクルされたビューではありません(IDによるビューを検出すると10%程度のパフォーマンスがキャッシュに値する)。仲介オブジェクトを気にするのではなく、IDでそれを必要とするときには、おそらくeditTextの値を取得する必要があります。しかし、いずれの場合でも、アクティビティのfindViewById(何でも)の代わりにdialog.findViewById(何でも)を使用し、メソッドにラッパーの代わりにダイアログを渡してみてください。 –

+0

DialogWrapperはテストのためだけに使用されます。可能であれば、別のレイアウトにリンクしてデータベースからデータを取り出し、EditTextに挿入することをお勧めします。 –

関連する問題