2015-07-26 1 views
0

Ceci est l'une des classes de mon projet Android. Je reçois un NoSuchElementException.Android: NoSuchElementException avec StringTokenizer

Quand je commente les deux StringTokenizer s (st et st1) ainsi que st.nextToken() et st1.nextToken() l'application fonctionne très bien.

package com.example.client_nic; 

import java.util.Calendar; 
import java.util.StringTokenizer; 

import com.example.client_nic.DataFields.fields; 

import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 

import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Meeting extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
      @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View view = inflater.inflate(R.layout.clientmeeting, container,false); //why false still unclear 
     EditText nameev= (EditText)view.findViewById(R.id.nameev); 
     final String name = nameev.getText().toString(); 
     if(name==null){ 
      Toast.makeText(getActivity(), "Name cannot be Empty", Toast.LENGTH_SHORT).show(); 
     } 

     EditText contactev= (EditText)view.findViewById(R.id.contactev); 
     final String contact = contactev.getText().toString(); 

     EditText addressev= (EditText)view.findViewById(R.id.Addressev); 
     final String address = addressev.getText().toString(); 

     EditText remarksev= (EditText)view.findViewById(R.id.remarksev); 
     final String remarks = remarksev.getText().toString(); 

     EditText dateev = (EditText)view.findViewById(R.id.dateev); 
     final String date = dateev.getText().toString(); 
     StringTokenizer st = new StringTokenizer(date, "/"); 


     final int day = Integer.parseInt(st.nextToken()); 
     final int month = Integer.parseInt(st.nextToken()); 
     final int year = Integer.parseInt(st.nextToken()); 

     EditText timeev = (EditText)view.findViewById(R.id.timeev); 
     final String time = timeev.getText().toString(); 

     StringTokenizer st1 = new StringTokenizer(time, ":"); 
     final int hourOfDay = Integer.parseInt(st1.nextToken()); 
     final int minute = Integer.parseInt(st1.nextToken()); 

     Button button = (Button)view.findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       Calendar calender = Calendar.getInstance(); 
       calender.set(year, month, day, hourOfDay, minute); 
       long inputtime = calender.getTimeInMillis(); 


       long presenttime = System.currentTimeMillis(); 
       if(inputtime<presenttime){ 
        Toast.makeText(getActivity(), "Time has already passed", Toast.LENGTH_SHORT).show(); 
       } 
       else{ 
        String insert = "INSERT INTO "+fields.table_name+" VALUES('"+name+"','"+contact+"','"+address+"','"+remarks+"','"+date+"','"+time+"') ";     
        Datastore ds = new Datastore(getActivity()); 
        SQLiteDatabase sql = ds.getWritableDatabase(); 
        sql.execSQL(insert); 
       } 
      } 
     }); 

     return view; 
    } 
} 
+0

Quelles chaînes essayez-vous de créer? – Joni

+1

Remarque: vous ne devez pas insérer de données brutes directement dans votre base de données. Regardez [Injection SQL] (http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work) et [instructions préparées avec SQLite dans Android] (http://stackoverflow.com/questions/433392/how-do-i-use-prepared-statements-in-sqlite-in-android). –

Répondre

0

Cela implique que soit la date que vous avez entré dans votre EditTextdateev ne contient pas assez / caractères ou le temps que vous avez inscrits dans votre EditTexttimeev ne contient pas assez : caractères.

Au lieu de StringTokenizer, vous devriez probablement utiliser String.split() comme suggéré dans la classe Aperçu de StringTokenizer. Bien sûr, cela ne règlera pas votre problème. Donc, pour résoudre votre problème, lorsque vous prenez le texte de l'utilisateur, vous devez vérifier le nombre d'éléments requis, plutôt que de supposer que le texte est dans le bon format. Alors vous feriez quelque chose comme:

String[] dateStrings = date.split("/"); 

int day; 
int month; 
int year; 
if (dateStrings.length == 3) { 
    day = Integer.parseInt(dateStrings[0]); 
    month = Integer.parseInt(dateStrings[1]); 
    year = Integer.parseInt(dateStrings[2]); 
} 

Et même pour time.