2010-12-02 4 views
1

J'essaie d'insérer des données dans la base de données SqLite à l'aide d'une enveloppe de dialogue. Cependant, je suis incapable de le faire. J'ai 2 textes intitulés Titre et Modèle à insérer dans la base de données. Mais ça plante. ci-dessous est mon code java:
@Override public boolean onCreateOptionsMenu (menu Menu) { de menu.add (0, MENU_ITEM_INSERT, 0, R.string.menu_insert); renvoyer true; }Erreur lors de l'insertion de données dans la base de données 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; 
    } 
} 

Ci-dessous mon LogCat:

12-02 08: 23: 17,712: ERREUR/AndroidRuntime (204): gestionnaire Uncaught: thread principal sortie en raison d'une exception non interceptée
12 au 2 août : 23: 17.862: ERROR/AndroidRuntime (204): java.lang.NullPointerException
12-02 08: 23: 17.862: ERROR/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: ERREUR/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): à l'adresse 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-02 08: 23: 17.862: ERROR/AndroidRuntime (204): à java.lang.reflect.Method.invokeNative (méthode native)
12-02 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): à l'adresse com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 618)
12-02 08: 23: 17.862: ERROR/AndroidRuntime (204): à dalvik.system.NativeStart.main (méthode native)

Modifier
Ceci est mon stacktrace à mon demandé concernant un commentaire:

12-06 16: 54: 12,466: INFO/ActivityManager (58): début de l'activité: {intention cmp = joel.GroupSMS/.TemplateEdit}
12-06 16: 54: 16.550: DEBUG/AndroidRuntime (254): Arrêt de la machine virtuelle 12-06 16: 54: 16.550: WARN/dalvikvm (254): threadid = 3: thread sortant avec une exception non interceptée (groupe = 0x4001b188)
12-06 16: 54: 16.550: ERROR/AndroidRuntime (254): gestionnaire Uncaught: thread principal sortant en raison d'une exception non interceptée
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): java. lang.RuntimeE xception: Impossible de démarrer l'activité ComponentInfo {joel.GroupSMS/joel.GroupSMS.TemplateEdit}: java.lang.NullPointerException
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java: 2496)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à l'adresse android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2512)
12-06 16: 54: 16.736: ERREUR/AndroidRuntime (254): at android.app.ActivityThread.access $ 2200 (ActivityThread.java:119)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à l'adresse android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1863)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à l'adresse android.os.Handler.dispatchMessage (Handler.java:99)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à l'adresse android.os.Looper.loop (Looper.java:123)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): at android.app.Activi tyThread.main (ActivityThread.java:4363)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à java.lang.reflect.Method.invokeNative (méthode native)
12-06 16:54 : 16.736: ERROR/AndroidRuntime (254): à java.lang.reflect.Method.invoke (Method.java:521)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à com.android. internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:860)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à l'adresse com.android.internal.os.ZygoteInit.main (ZygoteInit.java) : 618)
12-06 16: 54: 16,736: ERROR/AndroidRuntime (254): à dalvik.system.NativeStart.main (méthode native)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254) : Cau sed par: java.lang.NullPointerException
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): à android.content.ContentResolver.acquireProvider (ContentResolver.java:754)
12-06 16:54: 16.736: ERROR/AndroidRuntime (254): à l'adresse android.content.ContentResolver.query (ContentResolver.java:197)
12-06 16: 54: 16.736: ERROR/AndroidRuntime (254): at 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): at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)
12-06 16:54:16 0,736: ERREUR/AndroidRuntime (254): à android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2459)

Répondre

0

Il est difficile de dire sans numéros de ligne dans votre code pour correspondre à la retraçage mais je devine que (EditText) findViewById(R.id.title) retourne null. Vérifiez votre application dans hierarchyviewer au moment où vous effectuez l'insertion et assurez-vous que l'affichage que vous pensez être présent dans la hiérarchie est réellement présent au moment où vous traitez le code d'insertion.

+0

Vous êtes assez proche. La ligne d'erreur se situe au "getTitleField". Et oui, la vue est à la hiérarchie lors du traitement du code d'insertion. Je pense. –

+0

Je ne sais pas pourquoi vous vous ennuyez avec le DialogWrapper du tout; ce n'est pas une vue de recyclage dans une situation de liste (où la performance de 10% ou plus à trouver une vue par ID vaut la mise en cache); vous devriez probablement juste saisir la valeur d'editText quand vous en avez besoin par ID au lieu de vous embêter avec un objet intermédiaire. Mais dans tous les cas, essayez d'utiliser dialog.findViewById (quelquechose) au lieu de simplement findViewById de l'Activity (quelquechose), en passant le dialogue (au lieu d'un wrapper) à votre méthode. –

+0

DialogWrapper est juste utilisé pour les tests. Si possible, je préfère qu'il soit lié à une autre mise en page et récupère les données de la base de données et les insère dans les EditTexts. –

Questions connexes