2012-12-19 3 views
1

LogCat을 사용하여 문제의 원인을 파악했습니다. 나는에서 onCreate에서 실행하려고 SQL 문자열이안드로이드 - SQLiteOpenHelper onCreate에서 NullPointerException이 발생하는 이유는 무엇입니까?

.. 그것이이를 실행하려고

CREATE TABLE Routines(_id integer primary key autoincrement, json TEXT); 

문제가 발생합니다.

이것은 아마도 NullPointerException의 원인 일 수 있습니다. 잘못된 것을 볼 수 없다면 조금 더 많은 배경 정보를 읽으십시오.

이 데이터베이스는 아직 작성되지 않았으며, 계속 NullpointerException을 얻었습니다. 이전 SQLite 코드와 비교해 보았고 그 문제는 피할 수없는 것으로 입증되었습니다.

그러나 onCreate 메서드를 사용해야하므로이 내용을 언급합니다. 내 주 코드에서 DatabaseOpenHelper (SQliteOpenHelper 확장)을 새로 만들고 아래 보이는 것처럼 도우미의 open() 메서드를 호출하십시오.

public void open() throws SQLException 
{ 
    ssDatabase = databaseOpenHelper.getWritableDatabase(); 
} 

내가 잘못 입력하지 않은 경우 데이터베이스가 생성되지 않았으므로 (이전에 설치 제거를 통해 확인 했음). onCreate SQLiteHelper는 open() 메서드가 호출 될 때 호출됩니다.

이것은 내가 open 메소드라고 부르는 코드입니다.

try 
    {     
     dbConnector = new DatabaseConnector (this); 
     debug = "2 "; 

     // This on first start will invoke the database onCreate method - throws SQLException 
     dbConnector.open(); /* PROBLEM LINE */ 
     debug = "3 "; 
    } 
    catch (Exception e) 
    { 
     textView1.setText(debug + e.toString()); 
    } 

는 그리고 이것은 내 DatabaseOpenHelper과에서 onCreate 방법에 도움을

private class DatabaseOpenHelper extends SQLiteOpenHelper 
{ 
    public DatabaseOpenHelper(Context context, String name, CursorFactory factory, int version) 
    { 
     super(context, name, factory, version); 

     Log.i(TAG, "Constructor"); 
    } 

    // On initial creation of database 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     Log.i(TAG, "Before SQL command"); 

     String sqlCreateCommand = "CREATE TABLE Routines" 
       + "(_id integer primary key autoincrement, " 
       + "json TEXT);"; 

     Log.i(TAG, sqlCreateCommand); 

     // I believe this to be the PROBLEM LINE 
     ssDatabase.execSQL(sqlCreateCommand); 

     Log.i(TAG, "Jab done"); 
    } 

    // On upgrade - currently do nothing 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {}  
} 

감사를 포함하는 코드입니다!

+0

전체 스택 추적도 유용 할 것입니다. – span

+0

코드를 디버깅하여 찾으셨습니까? –

+0

흠, '문제'탭에있는 오류를 의미하는 경우이 경로에는 아무 것도 없습니다. 유일한 예외는 내가 TextView에 표시되는 것을 말하고있는 것입니다. 아마도 약간의 멍청한 짓을해야 할 것 같습니다 : P 그리고 거기에 내 LogCat에 예외가 생겨서 자기 자신의 태그에서 벗어났습니다. – mgibson

답변

4

나는 단지 코멘트를 게시하는 prvilege가없는 것 같습니다. 한 가지 질문 : ssDatabase.execSQL(sqlCreateCommand); -> 매개 변수가 SQLiteDatabase db이므로 db.execSQL(sqlCreateCommand); 이 아니어야합니다. 둘째로 _id를 사용합니다. 이 색인은 기본적으로 생성되지 않습니까? 이것과 관련이 없다면 신경 쓰지 마라. 이것은 단지 그것에 관한 나의 thoghts이었다. :)

+0

아, 내가 얼마나 바보인지! 하하, 내게 몇 시간의 코딩이 너에게 좋은가요? 감사! 그리고 내가 아는 한 기본값은 아니며 "_id"가 권장되며 ContentProviders와 함께 특수 기능을 허용하지만 여전히 설정해야합니다. 그것이 내가 지금까지 많은 튜토리얼에서 모은 것입니다. – mgibson

관련 문제