0

うまくいけば、多くのコードがないので、申し訳ありません。つまり、すべてを提供しているわけではありません (必要に応じて提供します)。しかし、私はそれをデバッグしていて、提供しているクラスの意図的な問題に問題を絞り込みましたが、間違っている可能性があります. 私のエラーは次のとおりです。

6-09 00:47:15.992: E/AndroidRuntime(728): java.lang.RuntimeException: Failure delivering
result ResultInfo{who=null, request=2, result=-1, data=Intent { 
cmp=com.zeroe/.ListManagersActivity (has extras) }} to activity 
{com.zeroe/com.zeroe.MainDisplayActivity}: java.lang.ArrayIndexOutOfBoundsException:
length=2; index=2
java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
06-09 03:27:42.732: E/AndroidRuntime(5076): at
com.zeroe.SmartCalDatabaseHelper.saveManagedEvent(SmartCalDatabaseHelper.java:106)
06-09 03:27:42.732: E/AndroidRuntime(5076): at 
com.zeroe.TimeManager.insertManagedEvents(TimeManager.java:100)

したがって、私のエラーは onActivityResult() メソッドにあり、問題は私が入れたものにアクセスできないという事実にあると想定しています。私はここで完全に推測していますが、インテントがクラスのスコープ外で作成された方法と関係があり、メソッドが呼び出されたときに、インテントがそのコンテキスト用ではないため、それを見つけることができません. 私はそれを経験してきましたが、今は何もありません。何時間も取り組んでいるので、ヒントがあれば大歓迎です!

編集: 明らかでない場合は申し訳ありませんが、このクラスはメイン アクティビティからインテントを介して呼び出され、setOnItmClickListener メソッド内で別のインテントを呼び出します。明確にするだけです。また、必要に応じて追加の投稿を依頼してください。コードで肥大化させたくないだけです。

最新の編集: わかりました、これを長い間見ていたので頭が死んでいますが、問題がどこにあるかを正確に指摘しました。DatabaseHelper クラスのデータベースに最後の「イベント」を挿入した直後にハングします。あなたがそれを見つけることができれば、それがどこにあるのかコメントしたと思いますが、問題は、なぜそのように失敗するのかわかりません。データベースを調べたところ、すべてが正しく挿入されていました!! しかし、一度完了してonActivityResultに戻ると、失敗するだけだと思います。それは私が問題に答えることができないところです。すべてが正しく行われているように見えますが、最後に、問題を引き起こしているインテント エンディングはどれですか? インテント onActivityResult メソッドの最後を処理する方法に何か不足していますか?

DatabaseHelper.java

/*Omitting imports, but they are there*/

public class DatabaseHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "smartcal.db";

private OpenHelper openHelper;
private SQLiteDatabase database;

public DatabaseHelper(Context context) {
    openHelper = new OpenHelper(context);
    database = openHelper.getWritableDatabase();

}

...

public Cursor getEventId(String eventName, String timeStamp) {

    return database.rawQuery("SELECT * FROM events WHERE time_stamp='"+timeStamp+"' AND event='"+eventName+"'", null);
}


public Cursor getAgendaToEdit(long id) {
    return database.rawQuery("SELECT * FROM events_info WHERE _id='"+id+"'", null);
}//end of getAgendaToEdit method


public Cursor getAgendaInfo(String date) {

    String query = "SELECT _id, event_name, start_date, start_time, end_date, end_time, " +
    "location FROM events_info WHERE date('"+date+"') >= start_date and date('"+date+"') <= end_date"; //add WHERE clause to filter for current day
    return database.rawQuery( query, null);
}//end getAgendaInfo



public Cursor getNumOfSteps(String id) {
    return database.rawQuery("SELECT _id, steps FROM managers WHERE _id='"+id+"'", null);
}

public Cursor getSteps(String id) {
    return database.rawQuery("SELECT _id, name FROM manager_steps WHERE boss='"+id+"' ORDER BY step_num", null);
}


public void saveManagedEvent(String eventId, String singleEventName, String location, String startDate, String startTime, String endDate, String endTime) {
    String[] tempDate = startDate.split("-");
    startDate = "";
    startDate = tempDate[2] + "-" + tempDate[0] + "-" + tempDate[1];
    tempDate = endDate.split("-");
    endDate = "";
    endDate = tempDate[2] + "-" + tempDate[0] + "-" + tempDate[1];

    ContentValues toSecondDatabase = new ContentValues();
    toSecondDatabase.put("event_id", eventId);
    toSecondDatabase.put("event_name", singleEventName);
    toSecondDatabase.put("start_date", startDate);
    toSecondDatabase.put("start_time", startTime);
    toSecondDatabase.put("end_date", endDate);
    toSecondDatabase.put("end_time", endTime);
    toSecondDatabase.put("location", location);
    database.insert("events_info", null, toSecondDatabase);
    /*HANGS HERE FOR SOME REASON AND GIVES ME THE ABOVE ERROR*/
}

public String saveSingleEvent(String event) {
    String timeStamp = getTimeStamp();

    ContentValues toFirstDatabase = new ContentValues();
    toFirstDatabase.put("event", event);
    toFirstDatabase.put("time_stamp", timeStamp);
    database.insert("events", null, toFirstDatabase);

    Cursor eventCursor = getEventId(event, timeStamp);
    eventCursor.moveToFirst();
    int eventId = eventCursor.getInt(0);
    eventCursor.close();
    return String.valueOf(eventId);
}


public String getTimeStamp() {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
    return sdf.format(new Date());
}
private static String pad(int c) {
    if (c >= 10)
        return String.valueOf(c);
    else
        return "0" + String.valueOf(c);
}



/*SQLITEOPENHLPER INNER CLASS HERE*/


}//end of SmartCalDatabaseHelper Class

TimeManager.java

...
public void createStepsArray() {

    Cursor stepsInfo = databaseHelper.getSteps(managerId);
    for(int i=0; i < numOfSteps; i++ ) {
        stepsInfo.moveToPosition(i);
        stepHolder[i] = stepsInfo.getString(1);
    }
    stepsInfo.close();
}//end of createStepsArray method

public void insertManagedEvents() {
    Calendar now = Calendar.getInstance();
    String id = databaseHelper.saveSingleEvent(eventName);

    for(int i=0; i < numOfSteps; i++) {
        if(i == 0) now.add(Calendar.DAY_OF_MONTH, addBetweenEvents - 1); 
        else 
        now.add(Calendar.DAY_OF_MONTH, addBetweenEvents);

        if(i == numOfSteps-1) {
            databaseHelper.saveManagedEvent(id, stepHolder[i], location, 
                    new StringBuilder().append(eYear).append("-").append(pad(eMonth)).append(pad(eDay)).toString(), 
                    "00:00", 
                    new StringBuilder().append(eYear).append("-").append(pad(eMonth)).append(pad(eDay)).toString(), 
                    "00:00");
        } else { 
            databaseHelper.saveManagedEvent(id, stepHolder[i], location, 
                    new StringBuilder().append(now.get(Calendar.YEAR)).append("-").append(pad(now.get(Calendar.MONTH)+1)).append("-").append(pad(now.get(Calendar.DAY_OF_MONTH))).toString(), 
                    "00:00", 
                    new StringBuilder().append(now.get(Calendar.YEAR)).append("-").append(pad(now.get(Calendar.MONTH)+1)).append("-").append(pad(now.get(Calendar.DAY_OF_MONTH))).toString(), 
                    "00:00");
        }
    }

}//end of insertManagedEvents method

MainActivity.java

...
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == EVENT_ENTRY_REQUEST_CODE) {
        if(resultCode == RESULT_OK) {
            //send the database the info sent back from add event activity
            databaseHelper.saveSimpleEvent(data.getStringExtra("event"),data.getStringExtra("location"), 
                    data.getStringExtra("start_date"), data.getStringExtra("start_time"), 
                    data.getStringExtra("end_date"), data.getStringExtra("end_time"));

                agendaAdapter.changeCursor(databaseHelper.getAgendaInfo(getChosenDate()));

        }
    }
    if(requestCode == MANAGED_EVENT_LIST_REQUEST_CODE) {
        if(resultCode == RESULT_OK) {
            //Do stuff when managed list is working alright, and 
            //after user enters necessary info, in order to create the events into the database
            TimeManager timeManager = new TimeManager(databaseHelper, data.getStringExtra("manager_id"), 
                    data.getStringExtra("event_name"), data.getStringExtra("events_subject"), data.getStringExtra("location"), data.getStringExtra("end_time"));
            if(timeManager.checkValidManager()== false) {
                //tell user it failed due to the days not being correct in order to manage time
            } else {
                timeManager.createStepsArray();
                timeManager.insertManagedEvents();
                /*OR HANGS HERE MORE LIKELY SINCE THIS IS WHERE THE ERROR SAYS*/
            }
        }
    }
}//end of onActivityForResult Method
...
4

2 に答える 2

1

あなたのコードから、 tag で AddManagedEventActivity余分に呼び出して送信していることがわかります 。次に、あなたは??からデータを取得したい この回答からデータを取得するため に使用する必要があると思います。目的の簡単な説明を提供しなかったため、コードに基づいています:P、申し訳ありませんがコメントできませんでした。担当者がいません:/String.valueOf(id)manager_idonActivityResultAddManagedEventActivityintent.getExtra(..)AddManagedEventActivity

于 2012-06-09T05:25:39.100 に答える
1

ループを配列のサイズに制限してみてください。

Cursor stepsInfo = databaseHelper.getSteps(managerId);
for(int i=0; i < stepHolder.length; i++ ) { //Use stepHolder.length instead.
    stepsInfo.moveToPosition(i);
    stepHolder[i] = stepsInfo.getString(1);
}
stepsInfo.close();

forループと同じ

for(int i=0; i < stepHolder.length; i++) { //stepHolder.length here too

エラー メッセージは、indexOutOfBounds があることを示していることに注意してください。つまり、配列に深く入り込みすぎています。ループを配列サイズに制限するか、numOfSteps の取得方法を修正してください。

于 2012-06-09T05:32:10.180 に答える