2011-08-02 2 views
0

내 데이터베이스에 항목을 삽입하는 동안 문제가 발생했습니다. 프로그램이 4 행을 통해 실행하고 잘 삽입하는 것이 정말 이상하지만 5 행에서 충돌이 발생하고 커서 또는 데이터베이스를 닫지 않은 응용 프로그램에 대한 세 가지 보고서가 표시됩니다. 내 코드에서는 커서와 데이터베이스를 모두 닫았다가 다시 열어서 어떻게 이런 일이 발생하는지 혼란 스럽습니다. 여기에 코드가 있습니다.Android 애플리케이션이 커서 또는 데이터베이스를 닫지 않았습니다.

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode) { 
     case REQUEST_CODE_NEW: 
      if (resultCode == -1) { 
       Integer chapterId = data.getIntExtra("chapterId", -1); 
       Toast toast = Toast.makeText(this, "Selected Chapter: " + chapterId.toString(), Toast.LENGTH_LONG); 
       if (chapterId != -1) { 
        DbHelper db = new DbHelper(this); 
        for (int i = 0; i < questions.getTitle().size(); i++) { 
         db.insertQuestion(chapterId.toString(), questions.getTitle().get(i), questions.getAnswer().get(i), questions.getAr().get(i)); 
        } 
       } 
       toast.show(); 
      } 
      break; 
    } 
} 

dbhelper 클래스를 통해 데이터베이스를 생성하는 방법입니다. 여기에 내가 아무 소용이 여전히 더 잘 관리하려고 노력하지만, 수 I 클래스 수준에서 커서를 데이터베이스 도우미

public void insertQuestion(String cat_id, String title, String answer, String article) { 
    db.execSQL("INSERT INTO " + QUESTION_TABLE_NAME + " (title,answer,article,picture) VALUES ('" + title + "','" + answer + "','" + article + "','none')"); 
    String id = getQuestionId(title); 
    db.execSQL("INSERT INTO " + REL_TABLE_NAME + " (question_id, cat_id) VALUES (" + id + "," + cat_id + ")"); 

} 
public String getQuestionId(String title) { 
    String id; 
    cursor = this.db.rawQuery("SELECT question_id FROM " + QUESTION_TABLE_NAME + " WHERE title = '" + title + "' LIMIT 1", null); 
    cursor.moveToFirst(); 
    id = cursor.getString(0); 
    cursor.close(); 
    db.close(); 
    return id; 
} 

입니다. 4 개의 쿼리 후에도 계속 충돌합니다.

+0

당신이 getQuestionId에 DB를 폐쇄에서 오류가 발생 해달라고 ...? db.close는 getQuestionId()가 아닌 for 루프의 종료에서 호출해야합니다. –

+0

충돌을 나타내는 logcat 출력을 게시하십시오. 무엇이 잘못되었는지를 나타내는 크래시의 근본 원인이 있습니다. – Femi

+0

나는 달린 쿼리를 볼 때 문제를 발견했다고 생각합니다. 거기에 복수형 단어와 기타 등등이 있습니다. PHP 같은 것을 빠져 나올 수있는 빠른 방법이 있습니까? – Shaun

답변

1

이가 "수정"보십시오 :

DbHelper db = new DbHelper(this); 
try{ 
        for (int i = 0; i < questions.getTitle().size(); i++) { 
         db.insertQuestion(chapterId.toString(), questions.getTitle().get(i), questions.getAnswer().get(i), questions.getAr().get(i)); 
        } 
}catch(Exception e1){ 
    android.util.Log.v("DbHelper Error","Crash: "+e1.getMessage(), e1); 
}finally{ 
db.close(); 
} 
+0

문제는 삽입하려는 문자열에 '문제가있었습니다. 그걸 벗어날 수있는 방법이 있나요? 그리고 다시 데이터베이스에서 읽을 때 다시 되돌릴 수 있습니까? 나는 html로 equivelant를 사용할 수 있지만, SQLite와 Java는 어떨까요? – Shaun

+0

예, ContentValues ​​클래스를 사용하여 삽입을 수행합니다. 예를 보려면 http://www.vogella.de/articles/AndroidSQLite/article.html#todo_database를 참조하십시오. 이것은 정확하게 이스케이프와 모든 것을 수행합니다. – Femi

관련 문제